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