1. ホーム
  2. バッシュ

[解決済み】Bashスクリプトに渡された引数の数を確認する

2022-03-23 01:30:52

質問

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

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

どうすればいいですか?

他の簡単なコマンドと同じです。 [ ... ] または 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 .

また、以下のように デイブ エラーメッセージは標準エラー出力に送られた方がよいでしょう。

echo "Illegal number of parameters" >&2

スクリプトを終了する

無効なパラメータが渡されたときにスクリプトが終了するようにするのも論理的です。 これはすでに コメント によって エカンガス が、誰かがこの答えを編集して、それを -1 を返り値として返すようにした方がいいかもしれませんね。

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

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

参考文献