[解決済み】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
何が間違っているのでしょうか?
どうすればいいですか?
他の簡単なコマンドと同じです。
[ ... ]
または
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
参考文献
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] bashシェルスクリプトの全引数を伝搬させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bashでjsonファイルを解析するために、jqの出力にあるダブルクオートを削除する方法は?
-
[解決済み】firebase-tools "-bash: firebase: command not found".
-
[解決済み】ログアウトと再ログインをせずに.bashrcの設定を再読み込みする方法?
-
[解決済み] Cp: ターゲットはディレクトリではありません
-
[解決済み] 部分的にコピーされたファイルでscpを再開する方法は?[クローズド]です。
-
[解決済み] ssh / リモートbashコマンドでシングルクォート文字をエスケープするにはどうすればよいですか?
-
[解決済み] docker alpine /bin/sh script.sh not found
-
[解決済み] bashで::演算子は何をするのですか?
-
[解決済み] AWS CLIのプロファイルを一時的に切り替えるには?
-
[解決済み] Linuxの標準的な終了ステータスコードはありますか?