次のコードは、
[:-ge:単項演算子が必要です
いつ
i=0
if [ $i -ge 2 ]
then
#some code
fi
どうして?
あなたの問題は、ステートメントが失敗したときに$i
が空の値を持つという事実から生じます。 比較を実行するとき、変数の1つが空になる可能性がわずかでもある場合、変数を常に引用する:
if [ "$i" -ge 2 ] ; then
...
fi
これは、シェルが変数を処理する方法が原因です。元の例を仮定します、
if [ $i -ge 2 ] ; then ...
その特定のコード行を実行するときにシェルが最初に行うことは、お気に入りのエディターのsearch&replace関数と同様に、$i
の値を置換することです。したがって、$i
が空であると仮定するか、または、より具体的には、$i
がスペースの束であると仮定してください。シェルは、次のように$i
を置き換えます。
if [ -ge 2 ] ; then ...
これで変数の置換が完了したので、シェルは比較を続行し、...失敗します。これは、-gt
のleftが理解できるものを何も表示できないためです。ただし、$i
を引用する:
if [ "$i" -ge 2 ] ; then ...
になる:
if [ " " -ge 2 ] ; then ...
シェルは二重引用符を確認し、実際に4つの空白を2と比較していることを認識し、if
をスキップします。
次のように、$i
が空白の場合、$i
のデフォルト値を指定するオプションもあります。
if [ "${i:-0}" -ge 2 ] ; then ...
これは、$i
が$i
が未定義である代わりに、値0に置き換えます。繰り返しますが、$i
が空白の束である場合、undefinedとしてカウントされず、0に置き換えられず、もう一度問題。
時間があるときに this をお読みください。シェルは多くの場合ブラックボックスのように扱われますが、ごく少数の非常に単純なルールで動作します-これらのルールが何であるかを理解すると(1つは上記で説明したように、シェルでの変数の動作方法です)、シェルは秘密はもうありません。
エラーメッセージから判断すると、iの値は、0ではなく空の文字列でした。
5セントを追加する必要があります。誰もが[
または[[
を使用しているようですが、それらはif構文の一部ではないことに言及する価値があります。
算術比較には、代わりに((...))
を使用します。
((...))は算術コマンドで、式がゼロ以外の場合は終了ステータス0を返し、式がゼロの場合は1を返します。副作用(割り当て)が必要な場合、「let」の同義語としても使用されます。
参照: 算術式
スクリプトの一部は非常にうまく機能します。 ifの前に "i"に他のものを割り当てていないのですか?
よくある間違いは、角括弧の前後にスペースを残さないことです。