5

位置パラメータが指定されていないかどうかをテストするBashで最も慣用的な方法は何ですか? これを確認する方法はたくさんありますが、好ましい方法が 1 つあるのではないかと思います。

いくつかの方法は次のとおりです。

((! $# )) # check if $# is 'not true'
(($# == 0)) # $# is 0
[[ ! $@ ]] # $@ is unset or null
4

5 に答える 5

9

私にとって、古典的な方法は次のとおりです。

[[ $# -eq 0 ]]
于 2012-07-15T14:05:00.870 に答える
1

賢明なセマンティクスを使用する

重要なのは、読みやすさとコードの意図です。特別な理由がない限り、パラメータ リストの長さを決定したいだけでしょう。

# Is length of parameter list equal to zero?
[ $# -eq 0 ]

ただし、コードの意図を表す任意のパラメーター展開演算子または比較演算子を確実に使用できます。これを行う正しい方法はありませんが、テストのセマンティクスが移植可能かどうかを検討することをお勧めします。

思考の糧

本質的に重要なのは条件式ではありません。重要なのは、なぜ知りたいのかということです。例えば:

set -e
foo="$1"
shift

# $2 is now $1 (but only if the line is reached)
echo "$1"

この場合、パラメータ リストの長さは直接チェックされません。最初のパラメーターは (設定されていない場合でも) 単に割り当てられ、パラメーター リストをシフトしようとすると、シェルはエラーをスローして終了します。このコードは、「パラメーターがそこにあることを期待しているだけです。明示的に確認する必要はありません」と述べています。

ここでのポイントは、コードが何を表現しようとしているのかを判断し、それをできるだけ明確に表現するためにテストと条件のセマンティクスを一致させる必要があるということです。直交する答えは本当にありません。

于 2012-07-15T14:44:58.807 に答える
1

位置パラメータがないことをエラーにしたい場合:

: ${@?no positional parameters}

が設定されていない場合、「位置パラメータなし」を標準エラーに出力します (非対話型シェルを終了します) $@

$#それ以外の場合は、0かどうかを確認するさまざまな方法の 1 つよりも優れたオプションを認識していません。

于 2012-07-15T14:26:06.747 に答える
-1

位置パラメーターがない場合、最初のパラメーターも存在しないという事実を使用することをお勧めします。

[[ -z $1 ]]
test -z "$1"
[ -z "$1" ]

読者にとってはほんの少し軽いだけです。もちろん、最初のパラメーターを空の文字列にすることはできないという仮定が真の場合にのみ機能します。

于 2012-07-15T13:45:36.937 に答える