5

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

一些方法是:

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

5 回答 5

9

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

[[ $# -eq 0 ]]
于 2012-07-15T14:05:00.870 回答
1

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

: ${@?no positional parameters}

如果未设置,则将“无位置参数”打印到标准错误(并退出非交互式外壳)$@

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

于 2012-07-15T14:26:06.747 回答
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 会抛出错误并退出。这段代码说“我只是希望参数在那里;我不应该明确地检查它们。”

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

于 2012-07-15T14:44:58.807 回答
1

这是一个最合乎逻辑的方式:

[ ! $@ ]

它基于一条规则:

[ ] # this returns 1

好吧,

[ ! ] # this returns 0

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

测试:(即使你扔几个空字符串(“”“”“”)它也会起作用。)

if [ ! $@ ]; then
    printf 'Note: No arguments are given.'
fi
于 2017-08-11T22:53:17.330 回答
-1

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

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

它对读者来说只是轻了一点。当然,它仅在第一个参数不能为空字符串的假设成立时才有效。

于 2012-07-15T13:45:36.937 回答