コマンドにパラメーターが提供されていないことを確認する方法は?


回答:


112

コマンドに引数が指定されていないかどうかを確認するには、$#変数の値を確認してから、

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

使用したい場合$*好ましくありません)、

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

いくつかの説明:

2番目のアプローチは、位置パラメータの展開*が1から始まる位置パラメータに拡張されるため、好ましくありません。二重引用符内で展開が行われると、各パラメーターの値がIFS特殊変数の最初の文字で区切られた単一の単語に展開されます。つまり、文字列が構築されます。したがって、余分なオーバーヘッドがあります。

一方#、位置パラメータの数に展開されます。

例:

$ command param1 param2

ここに、

値が$#2であるとの値は、$*IFSが設定されていない場合には、(引用符なし)文字列「のparam1 PARAM2」です。IFSが設定されていない場合、パラメーターはスペースで区切られるため

詳細についてはman bash特別なパラメーターという名前のトピックをお読みください


5
またはif ! (($#)); ...、またはif (($# == 0)); ...、またはif [ $# -eq 0 ]; ...、または! (($#)) && ...、または(($#)) || ...
nicerobot

7
[ $# -eq 0 ]最も一般的な形式のIMEです。"$#"空にできるエッジケースが$IFSあります。空の引数が1つある場合、または空の引数が複数あり空である場合。
ジル

1
"$*"発現は、と評価されます""唯一の場合は""パラメータが渡されました。しかし、ほとんどの場合、おそらくとにかく気にしないでしょう。
マナトワーク

==の代わりに=にすべきだと思います...現在、予期しないオペレータエラーが発生しています。=に変更すると問題が修正されます。
まあ実際には

@Charlotteつまり、使用していないことを意味しますbashshスクリプトの実行に使用しています。AFAIKはで==のみ有効ですbash
サチンディベカー

14

特定の引数が欠落している場合にのみベイリングに関心がある場合は、パラメータの置換が優れています。

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

-4

これは、あなたが議論をしていないことを知ることができる方法の1つです

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi

5
それが受け入れられた答えは5年前に書いたものを行うための複雑な方法のようです....
ジェフ・シャラーは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.