304

このスクリプトはエラーになります:

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

5 に答える 5

660

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

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

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

を使用する場合は[ ... ]、常に次のような変数を二重引用符で囲むことを忘れないでください。

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

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

if [ = "and" ];

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

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

于 2012-11-29T03:31:22.493 に答える
44

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

[: =: unary operator expected

正しい:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

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

set -x
于 2017-09-21T20:43:40.823 に答える
8

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

于 2015-09-25T12:27:22.370 に答える
0

このエラーは、(デフォルトのオプションを受け入れるために)空白になる可能性のある数値入力の読み取りでも発生する可能性があります。

解決策は、複数の条件を使用してステートメントを構造化し、if最初に空の変数をテストすることです。

例えば:

# sanitise input
var=$(echo $ans | tr -cd "[:digit:]")

if [ -z "$var" ] || [ "$var" -lt 1 ]; then
   do_something
fi

ArchSignModulesのヘルパースクリプトでこのunary operator expected問題を解決する必要がありました。remove_old_pkgs()abk

6.4Bash条件式も参照してください。

于 2021-09-14T13:34:11.510 に答える
-13

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

次の構文に従います:$ {VARIABLE:-default}。

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

何らかの理由でそれが不可能な場合は、「if [-z $ VARIABLE]; then echo "the variable need to fill"」、または「"の行に沿って、値があるかどうかを確認するなどの手順を追加する必要があります。 if [!-z $ VARIABLE]; then #everythingは問題ないので、スクリプトの残りの部分に進んでください。

于 2014-05-01T08:11:33.913 に答える