Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 测试是否未给出位置参数的惯用方法?_Bash_Parameters_Command Line Arguments_Idioms_Conditional Statements - Fatal编程技术网

Bash 测试是否未给出位置参数的惯用方法?

Bash 测试是否未给出位置参数的惯用方法?,bash,parameters,command-line-arguments,idioms,conditional-statements,Bash,Parameters,Command Line Arguments,Idioms,Conditional Statements,如果没有给出位置参数,Bash中最惯用的测试方法是什么?有这么多的方法来检查这一点,我想知道是否有一个首选的方法 有些方法是: ((! $# )) # check if $# is 'not true' (($# == 0)) # $# is 0 [[ ! $@ ]] # $@ is unset or null 我更喜欢使用这样一个事实,即如果没有位置参数,也没有第一个参数: [[ -z $1 ]] test -z "$1" [ -z "$1" ] 它只是在阅读器上轻了一点。当然,只有当第一

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

有些方法是:

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

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

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

它只是在阅读器上轻了一点。当然,只有当第一个参数不能是空字符串的假设成立时,它才起作用。

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

[[ $# -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"
在这种情况下,永远不会直接检查参数列表的长度。第一个参数被简单地赋值(即使它可能未设置),然后shell抛出一个错误并在您尝试移动参数列表时退出。这段代码说“我只希望参数在那里;我不应该显式地检查它们。”


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

这里有一个最符合逻辑的方法:

[ ! $@ ]
它基于一条规则:

[ ] # this returns 1
那么

[ ! ] # this returns 0
剩下的是显而易见的: $@是一个特殊参数,可扩展为所有位置参数的列表

测试: (即使您向它抛出两个空字符串(“”“”),它也会工作。)


如果第一个参数是空字符串:
foo”2
,则此操作将失败。当然,因为这是我的代码,如果我知道空字符串是有效参数,则不会使用此方法。这不会改变这样一个事实,即这不会测试位置参数的存在。我想您的意思是
[-n“$1”]
。-N标记检查字符串的长度是否为非零。这是相同的,它只涉及如何使用结果。最后一个将在代码< >脚本'< /COD>(null参数)上出现假阳性。IMO您应该重新考虑什么是“无位置参数”。例如,您是否考虑一个空参数(<代码>您的脚本'< /代码>)一个有效的参数?+ 1,而是使用<代码> [[…] ] /代码>。code>[…]是一个内置的bash,而
[…]
调用外部测试实用程序。从外观上看,前者更快。更新为使用
[[…]]
,这确实更好。实际上,
[
也是一个bash内置的(它覆盖/bin/[),所以它们的速度应该差不多。最大的区别是
[…]
避免了一些字符串解析的复杂性,这在这里不适用。
[[
不是内置的,它是一个关键字。将
类型[
类型[[
进行对比。这意味着它在命令行扩展的早期是互选的,例如,为什么不需要使用嵌入空格引用变量。
if [ ! $@ ]; then
    printf 'Note: No arguments are given.'
fi