簡単なスクリプトを試してみたいです。
flag=false
while !$flag
do
read x
if [ "$x" -eq "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
ただし、実行時に入力するとandがtrue
表示されますが、ループは終了しません。スクリプトにどのような問題がありますか?ブール変数を正しく反転する方法は?x="true"
flag="true"
ベストアンサー1
スクリプトには2つのエラーがあります。 1つ目は、!
との間にスペースが必要です$flag
。それ以外の場合、シェルはというコマンドを探します!$flag
。 2番目のエラーは-eq
整数比較のためのものですが、文字列に使用しています。シェルによってはエラーメッセージが表示され、条件が真になることができないか、整数以外のすべての値がゼロとして処理されるため、ループは永久に続行されます。を含む文字列を入力すると、[ "$x" -eq "true" ]
ループはfalse
次の数字で終了します。 0.
これは正しいですが、! $flag
文字列をコマンドとして扱うことはお勧めできません。動作しますが、スクリプトの変更に非常に敏感です。またはそれ以外のもので$flag
ないことを確認する必要があるからです。ここでは、以下のテストのように文字列比較を使用する方が良いです。true
false
flag=false
while [ "$flag" != "true" ]
do
read x
if [ "$x" = "true" ]
then
flag=true
fi
echo "${x} : ${flag}"
done
あなたが求める論理を表現するより良い方法があります。たとえば、無限ループを作成し、終了条件が検出された場合はこれを中止できます。
while true; do
read -r x
if [ "$x" = "true" ]; then break; fi
echo "$x: false"
done