测试习惯的方法,如果没有位置PARAMS给出?(Idiomatic way to test if n

2019-06-26 07:40发布

什么是Bash中最惯用的方式来测试,如果没有位置给定参数? 有这么多的方法来检查这一点,我不知道是否有一个首选方式。

有些方法是:

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

Answer 1:

对我来说,传统的方法是:

[[ $# -eq 0 ]]


Answer 2:

如果你希望它是有没有位置参数的错误:

: ${@?no positional parameters}

将打印“没有位置参数”标准错误(和退出非交互的shell)如果$@未设置。

否则,我不知道的比的检查,如果各种方法的任何一个更好的选择, $#为0。



Answer 3:

使用合理的语义

关键是可读性和代码的意图。 除非你有一个很好的理由不这样做,你可能只是想确定参数列表的长度。

# 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"

在这种情况下,参数列表的长度不会直接检查。 第一个参数是简单地分配(尽管它可能是未设置),然后当你推诿的参数列表中壳抛出一个错误,然后退出。 这段代码说:“我只是希望这些参数在那里,我不应该明确地查询到。”

这里的关键是,你需要确定你的代码所要表达的,并符合您的测试和条件的语义来表达尽可能清楚就可以了。 真的是没有正交的答案。



Answer 4:

这里有一个最合理的方式:

[ ! $@ ]

它是基于一个单一的规则:

[ ] # this returns 1

好吧,

[ ! ] # this returns 0

其余的是很明显的:$ @是扩展到所有的位置参数列表的特殊参数。

测试:(如果你在它扔了几个空字符串(“”“”“”),它仍然工作)

if [ ! $@ ]; then
    printf 'Note: No arguments are given.'
fi


Answer 5:

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

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

这是对读者较轻的只是一点点。 当然,只有当第一个参数不能为空字符串的假设是正确的工作。



文章来源: Idiomatic way to test if no positional params are given?