ひも

ひも

簡単なスクリプトを試してみたいです。

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ないことを確認する必要があるからです。ここでは、以下のテストのように文字列比較を使用する方が良いです。truefalse

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

おすすめ記事