Until / doループは期待どおりに機能しますが、いくつかの構文エラーが発生します。

Until / doループは期待どおりに機能しますが、いくつかの構文エラーが発生します。

次のbashスクリプトは、2番目のbashスクリプトを実行した後に2番目のスクリプトの効果を観察するのを待ちますuntil / do。このスクリプトは RHEL7 サーバーで実行されます。

FILE=/sentinel_failover.sh
if test -f "$FILE"; then
    echo "$FILE exists."
    OUTPUT=$("$FILE")
    echo $OUTPUT

    $counter=0
    $max_loop_count=30
    #Continue when no instances on this server are primary or the timeout has elapsed
    until (( $counter == $max_loop_count || $primary_byte_count == 0 ))
    do
      primary_byte_count=$(grep /etc/redis/redis.* -e port -e auth \
      | sed 's/.*\:port/redis-cli -p/' \
      | sed -e 'N;s/\n/ /' \
      | sed 's#\/etc\/redis\/redis.* "# -a #' \
      | sed -e 's/"/ --no-auth-warning info \| grep role/' \
      | sed -e 'N;s/  / /' \
      | source /dev/stdin \
      | grep master \
      | wc -c)
      sleep 1
      ((counter++))
    done

  if [[ $primary_byte_count -eq 0 ]]
  then
        exit 0
  else
        fail_step "Incomplete failover before reaching max loop count of 30 $max_loop_count"
  fi

スクリプトは期待どおりに動作します。戦略的位置でカウンタ値をエコーし​​てこれを確認しましたが、ループが最初に実行されたときに次のエラーが発生します。

/test_script.sh: line 8: =0: command not found
/test_script.sh: line 9: =30: command not found
/test_script.sh: line 11: ((: == 30 ||  == 0 : syntax error: operand expected (error token is "== 30 ||  == 0 ")

この問題を解決するには、比較を再構成するか、スクリプトを変更するにはどうすればよいですか?

ベストアンサー1

$変数の値を設定するときは、var=value使用しないで変数名のみを使用してください$var=value

スクリプトには次の2行があります。

$counter=0
$max_loop_count=30

これにより構文エラーが発生し、シェルはそれを変数割り当てとして認識せず、代わりにコマンドとして実行しようとします。端末に貼り付けて簡単に確認できます。

$ $counter=0
bash: =0: command not found
$ $max_loop_count=30
bash: =30: command not found

この行は実際に変数の値を設定しないため、次の構文エラーが発生します。

/test_script.sh: line 11: ((: == 30 ||  == 0 : syntax error: operand expected (error token is "== 30 ||  == 0 ")

これは、この行を実行すると次のようになるためです。

until (( $counter == $max_loop_count || $primary_byte_count == 0 ))

すべての変数に値がないので、テストは == 0

次のように変数の割り当てを修正して、3つのエラーをすべて修正できます。

counter=0
max_loop_count=30

最後に、シェルファイルの変数に大文字を使用しないでください。慣例は環境変数に大文字を使用することなので、独自の変数に大文字を使用すると名前の競合が発生し、エラーを追跡するのが難しい場合があります。通常、変数は常に小文字のままにするのが最善です。

おすすめ記事