什么是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}
将打印“没有位置参数”标准错误(和退出非交互的shell)如果$@
未设置。
否则,我不知道的比的检查,如果各种方法的任何一个更好的选择, $#
为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"
在这种情况下,参数列表的长度不会直接检查。 第一个参数是简单地分配(尽管它可能是未设置),然后当你推诿的参数列表中壳抛出一个错误,然后退出。 这段代码说:“我只是希望这些参数在那里,我不应该明确地查询到。”
这里的关键是,你需要确定你的代码所要表达的,并符合您的测试和条件的语义来表达尽可能清楚就可以了。 真的是没有正交的答案。
这里有一个最合理的方式:
[ ! $@ ]
它是基于一个单一的规则:
[ ] # this returns 1
好吧,
[ ! ] # this returns 0
其余的是很明显的:$ @是扩展到所有的位置参数列表的特殊参数。
测试:(如果你在它扔了几个空字符串(“”“”“”),它仍然工作)
if [ ! $@ ]; then
printf 'Note: No arguments are given.'
fi
我更喜欢使用的事实,如果没有位置参数,也没有第一个参数:
[[ -z $1 ]]
test -z "$1"
[ -z "$1" ]
这是对读者较轻的只是一点点。 当然,只有当第一个参数不能为空字符串的假设是正确的工作。