Bash スクリプトに渡される引数の数を確認する 質問する

Bash スクリプトに渡される引数の数を確認する 質問する

必要な引数数が満たされていない場合、Bash スクリプトでエラー メッセージを出力するようにしたいと思います。

次のコードを試しました:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

何らかの理由で、次のエラーが発生しました:

test: line 4: [2: command not found

何が間違っているのでしょうか?

ベストアンサー1

他の単純なコマンドと同様に、[ ... ]またはではtest引数の間にスペースが必要です。

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

または

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

提案

Bash では、[[ ]]単語の分割や変数へのパス名の拡張が行われないため、式の一部でない限り引用符で囲む必要がないため、代わりに を使用することをお勧めします。

[[ $# -ne 1 ]]

extglobまた、引用符なしの条件のグループ化、パターン マッチング ( を使用した拡張パターン マッチング)、正規表現マッチングなどの他の機能も備えています。

次の例では、引数が有効かどうかを確認します。 1 個または 2 個の引数が許可されます。

[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

純粋な算術式の場合、 を使用する方がまだ良いかもしれませんが、 、、、などの算術演算子を使用したり、式を単一の文字列引数として配置したりすることで、(( ))でも可能です。[[ ]]-eq-ne-lt-le-gt-ge

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

他の機能と組み合わせる必要がある場合にも役立つはずです[[ ]]

[[ ]]および は、、、、およびと同じ(( ))解析レベルを持つキーワードであることに注意してください。ifcasewhilefor

また、デイブ提案されているように、エラー メッセージは stderr に送信され、stdout がリダイレクトされたときに含まれないようにします。

echo "Illegal number of parameters" >&2

スクリプトを終了する

無効なパラメータが渡されたときにスクリプトを終了するようにすることも理にかなっています。これはすでに提案されています。コメントによるエカンガスしかし、誰かがこの回答を編集して、戻り値としてそれを含めるようにしたので-1、私も正しく行うほうがよいでしょう。

-1Bash では の引数として受け入れられますが、exit明示的に文書化されておらず、一般的な提案として使用するのは適切ではありません。は で64とともに定義されているため、最も正式な値でもあります。などのほとんどのツールも、無効な引数に対してを返します。私も以前はスクリプトで を返していましたが、最近は気にしなくなり、すべてのエラーで を使用するようになりました。しかし、これが最も一般的であり、おそらく OS 固有ではないため、ここに配置します。sysexits.h#define EX_USAGE 64 /* command line usage error */ls2212

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters" >&2
    exit 2
fi

参考文献

おすすめ記事