bashの整数を比較し、単項演算子が必要です


回答:


295

問題は$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ます。

次のように、$iif $iが空白の場合のデフォルト値を指定するオプションもあります。

if [ "${i:-0}" -ge 2 ] ; then ...

これは、未定義で$iはなく値0に置き換えられます$i。繰り返しになりますが、もし$i空白がたくさんある場合はundefinedとして数えられず、0に置き換えられないので、もう一度問題にぶつかります。

読んでください、これをあなたは時間があるとき。シェルは多くの場合ブラックボックスのように扱われますが、非常に少数の非常に単純なルールで動作します-それらのルールが何であるかを理解すると(上記のように、それらの1つはシェルでの変数の動作方法です)、シェルは秘密はもうありません。


7
変数を引用することなどの新しいエラー上昇すると予想整数式
ネストル

@Néstorが間違っています。変数を引用符で囲んでも、変数が数値の場合、整数式のように新しいエラーは発生しません。引用符付きかどうかに関係なく、数値以外の変数値を指定する、上記のエラーが発生します。
vladr 2016

6

エラーメッセージから判断すると、iの値は、実行時に0ではなく空の文字列でした。


6

5セント追加する必要があります。私は皆が[orを使用しているのを見ます[[が、それらはif構文の一部ではないことを言及する価値があります。

算術比較の場合は、((...))代わりに使用してください。

((...))は算術コマンドであり、式がゼロ以外の場合は終了ステータス0を返し、式がゼロの場合は1を返します。副作用(割り当て)が必要な場合、「let」の同義語としても使用されます。

参照:ArithmeticExpression


2

あなたのスクリプトはうまくいきます。if "i"の前に他に何も割り当てていませんか?

よくある間違いは、角括弧の前後にスペースを残さないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.