如果没有给出位置参数,Bash中最常用的测试方法是什么?有很多方法可以检查这个,我想知道是否有一种首选方式。
有些方法是:
((! $# )) # check if $# is 'not true'
(($# == 0)) # $# is 0
[[ ! $@ ]] # $@ is unset or null
答案 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" ]
阅读器上只有一点点亮。当然,只有在第一个参数不能为空字符串的假设为真时才有效。