2

終了しない while ループを含むシェル スクリプトがあります。wgetステートメントは metrueまたはを返しますfalse。値がtrue

#!/bin/bash
status="false";
while [ "$status" != true ]
 do
  status=`wget -q -O - http://server`
  echo $status
  echo "Sleeping for 5 sec";
  sleep 5;
done

出力:

false
Sleeping for 5 sec
false
Sleeping for 5 sec
true
Sleeping for 5 sec
true
Sleeping for 5 sec
true
.............
4

2 に答える 2

0

確かなことはわかりませんが、問題はサーバーから応答が CRLF ライン ターミネータ (つまり、改行文字の後に改行が続く) で返されていることだと思います。シェルが でコマンド置換を行う場合wget ...、最後の改行は削除されますが、キャリッジ リターンは削除されません。その結果、「$status」は「true」ではなく、「true\r」になります (\r は CR を示します)。次のコマンドを使用してtrCR を削除し、混乱を避けることができます。

(編集:どうやら迷子の改行もあるようです。それをtrのkillリストに追加し、念のためechoコマンドにいくつかの...明確化を追加して、こっそり通り抜けた不可視のものを表示しました。)

#!/bin/bash
status="false";
while [ "$status" != true ]
 do
  status=$(wget -q -O - http://server | tr -d "\r\n")
  echo "'$status'" | cat -v
  echo "Sleeping for 5 sec"
  sleep 5
done

(また、冗長なセミコロンをいくつか削除し、逆引用符で囲まれたコマンド置換を$( ... )-- に置き換えました。同じことを行いますが、読みやすくなり、ネストとエスケープによる奇妙な構文の不具合を回避できます)。

于 2013-06-03T01:19:11.087 に答える
0

スクリプトに引用符の問題があり、サブシェルを開始する方法が無効な構文です。

また、末尾に空白やその他の文字がないことを確認する必要があります。

#!/bin/bash
status="false";
# quote the "true"
while [ "$status" != "true" ]
 do
  # use $(...) to start a sub shell
  status=$(wget -q -O - http://server)
  # add >> << to make extra space visible. use quotes
  echo ">>$status<<"
  echo "Sleeping for 5 sec";
  sleep 5;
done
于 2013-06-03T00:26:14.093 に答える