必要な引数数が満たされていない場合、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.
他の機能と組み合わせる必要がある場合にも役立つはずです[[ ]]
。
[[ ]]
および は、、、、およびと同じ(( ))
解析レベルを持つキーワードであることに注意してください。if
case
while
for
また、デイブ提案されているように、エラー メッセージは stderr に送信され、stdout がリダイレクトされたときに含まれないようにします。
echo "Illegal number of parameters" >&2
スクリプトを終了する
無効なパラメータが渡されたときにスクリプトを終了するようにすることも理にかなっています。これはすでに提案されています。コメントによるエカンガスしかし、誰かがこの回答を編集して、戻り値としてそれを含めるようにしたので-1
、私も正しく行うほうがよいでしょう。
-1
Bash では の引数として受け入れられますが、exit
明示的に文書化されておらず、一般的な提案として使用するのは適切ではありません。は で64
とともに定義されているため、最も正式な値でもあります。などのほとんどのツールも、無効な引数に対してを返します。私も以前はスクリプトで を返していましたが、最近は気にしなくなり、すべてのエラーで を使用するようになりました。しかし、これが最も一般的であり、おそらく OS 固有ではないため、ここに配置します。sysexits.h
#define EX_USAGE 64 /* command line usage error */
ls
2
2
1
2
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters" >&2
exit 2
fi