如果没有给出位置参数,Bash 中最惯用的测试方法是什么?有很多方法可以检查这一点,我想知道是否有一种首选方法。
一些方法是:
((! $# )) # check if $# is 'not true'
(($# == 0)) # $# is 0
[[ ! $@ ]] # $@ is unset or null
如果没有给出位置参数,Bash 中最惯用的测试方法是什么?有很多方法可以检查这一点,我想知道是否有一种首选方法。
一些方法是:
((! $# )) # check if $# is 'not true'
(($# == 0)) # $# is 0
[[ ! $@ ]] # $@ is unset or null
对我来说,经典的方式是:
[[ $# -eq 0 ]]
如果您希望没有位置参数是错误的:
: ${@?no positional parameters}
如果未设置,则将“无位置参数”打印到标准错误(并退出非交互式外壳)$@
。
否则,我不知道有比检查是否$#
为 0 的各种方法之一更好的选择。
关键是代码的可读性和意图。除非您有充分的理由不这样做,否则您可能只想确定参数列表的长度。
# 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 会抛出错误并退出。这段代码说“我只是希望参数在那里;我不应该明确地检查它们。”
这里的重点是你需要确定你的代码试图表达什么,并匹配你的测试和条件的语义以尽可能清楚地表达出来。真的没有正交的答案。
这是一个最合乎逻辑的方式:
[ ! $@ ]
它基于一条规则:
[ ] # this returns 1
好吧,
[ ! ] # this returns 0
其余的很明显:$@ 是扩展为所有位置参数列表的特殊参数。
测试:(即使你扔几个空字符串(“”“”“”)它也会起作用。)
if [ ! $@ ]; then
printf 'Note: No arguments are given.'
fi
我更喜欢使用这样一个事实,即如果没有位置参数,也没有第一个参数:
[[ -z $1 ]]
test -z "$1"
[ -z "$1" ]
它对读者来说只是轻了一点。当然,它仅在第一个参数不能为空字符串的假设成立时才有效。