Bashのif条件で「単項演算子が必要です」エラー


225

私はこれの何が悪いのかを理解しようとしましたが、それを理解することはできません。

これはエラーが発生しているようです。

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

私はこのエラーを受け取ります:

calc_1.2: line 75: [: =: unary operator expected

4
if75行目のステートメントにはが必要だと思いますfi
Steve

7
疑問がある場合は、変数を引用してください。
koola 2012年

9
@koola、「常に」変数を引用します。
CousinCocaine 14

回答:


480

常にbashを使用することがわかっている場合[[ ... ]]は、Posix互換のシングルブラケットバージョンの代わりに、ダブルブラケット条件付き複合コマンドを常に使用する方がはるかに簡単[ ... ]です。[[ ... ]]複合語の内部では、単語分割とパス名展開は単語に適用されないため、信頼できます。

if [[ $aug1 == "and" ]];

の値を$aug1文字列と比較しますand

を使用する場合は[ ... ]、常に次のように変数を二重引用符で囲むことを覚えておく必要があります。

if [ "$aug1" = "and" ];

変数の展開を引用せず、変数が未定義または空の場合、犯罪の現場から消えて、

if [ = "and" ]; 

これは有効な構文ではありません。(また、$aug1空白またはシェルのメタ文字が含まれていると、別のエラーメッセージで失敗します。)

現代の[[演算子には、正規表現のマッチングなど、他にも多くの優れた機能があります。


9
「モダン」?[[は常に bashでしたか?それは20年以上にわたりKornシェルで使用されており、bashよりも前から存在しています。(私はあなたが何を意味するか知っています)
cdarke

31

これを見つけるのにしばらく時間がかかりましたが、間隔エラーがある場合も同じエラーが発生することに注意してください:

[: =: unary operator expected

正しい:

if [ "$APP_ENV" = "staging" ]

if ["$APP_ENV" = "staging" ]

いつものように-xデバッグ変数を設定すると、これらを見つけるのに役立ちます:

set -x

誰かがビルドスクリプトで私にこのバグを遺贈しました。時間を節約してくれてありがとう!
カイル

8

ステートメントで$aug1使用する前に値を割り当ててみてくださいif[]。エラーメッセージはその後消えます。


0

あなたが言う...:

elif [$ operation = "man"]; 次に、[$ aug1 = "add"]; 次に#<-75行目echo "Man Page for:add" echo "" echo "構文:add [number 1] [number 2]" echo "" echo "Description:" echo "2つの異なる数値を一緒に追加します。" echo "" echo "情報:" echo "v1.0で追加" echo "" elif [-z $ aug1]; 次に、「manページを読み取るコマンドを指定してください。」とエコーします。else echo「そのコマンドのマニュアルページはありません。」fi

私はそれだけのスペースだと思います...このようにしてください:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

変数のデフォルト値を設定することもできるため、1つの代わりに2つのプロセスに相当する2つの「[」を使用する必要はありません(「[」は実際にはプログラムです)。

これは、$ {VARIABLE:-default}という構文で行われます。

全体は、この「デフォルト」値が「有効な」値/コンテンツとは異なるものであるように考える必要があります。

何らかの理由でそれが不可能な場合は、「if [-z $ VARIABLE];の行に沿って、値があるかどうかを確認するなどの手順を追加する必要があります。その後、「変数を入力する必要があります」または「 if [!-z $ VARIABLE];その後、#すべてに問題がなければ、残りのスクリプトを続行します。


3
[[は2つのプロセスを生成しません。これはシェル組み込みです([Bash組み込みでもあります)。2番目を文字列として処理する[[とは異なります[ [[
user123444555621
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.