用于测试是否没有给出位置参数的惯用方法?

时间:2012-07-15 13:34:03

标签: bash parameters command-line-arguments idioms conditional-statements

如果没有给出位置参数,Bash中最常用的测试方法是什么?有很多方法可以检查这个,我想知道是否有一种首选方式。

有些方法是:

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

4 个答案:

答案 0 :(得分:4)

对我来说,经典的方式是:

[[ $# -eq 0 ]]

答案 1 :(得分:1)

如果您希望错误没有位置参数:

: ${@?no positional parameters}
如果未设置$@

将向标准错误打印“无位置参数”(并退出非交互式shell)。

否则,我不知道比检查$#是否为0的各种方法更好的选项。

答案 2 :(得分: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"

在这种情况下,永远不会直接检查参数列表的长度。第一个参数是简单分配的(即使它可能未设置),然后shell抛出一个错误并在您尝试移动参数列表时退出。这段代码说“我只希望参数存在;我不应该明确地检查它们。”

这里的要点是你需要确定你的代码试图表达什么,并匹配你的测试和条件的语义,以尽可能清楚地表达。确实没有正交答案。

答案 3 :(得分:-1)

我更喜欢使用如果没有位置参数,也没有第一个参数:

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

阅读器上只有一点点亮。当然,只有在第一个参数不能为空字符串的假设为真时才有效。