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