从https://unix.stackexchange.com/a/94200/674
如果没有位置参数($# 为 0),则“$@”扩展为没有什么(不是一个空字符串, 但包含 0 个元素的列表)
那么空字符串和包含 0 个元素的列表的行为有何不同呢?
“包含 0 个元素的列表”是否意味着“包含 0 个元素的数组”?我不认为 bash 有 的概念list
。
“无”是否可以表示不一定是“列表”或数组的东西?
答案1
是的,大多数 shell 没有列表的概念(用于变量)。
这不是定义的内容类型(与字符串或数字分开)。
然而,命令的参数是一个列表。
这是一种非常特殊的数据类型,仅"$*"
或"$@"
将表达为列表。但也有区别:
$ set -- one two t33
$ printf '<%s> ' "$*" ; echo
<one two t33>
$ printf '<%s> ' "$@" ; echo
<one> <two> <t33>
$ for s; do printf '<%s>' "$s" ; done; echo
<one><two><t33>
解释完后,引用的意思是具有 0 个元素的参数列表相当于没有元素的列表。
简而言之:列表消失(没有要打印的元素):
$ set -- $ echo $# 0 $ printf '<%s>' "$@" ; echo <> $ for s in "$*"; do echo "<a>" ; done <a> $ for s in "$@"; do echo "<a>" ; done $
最后的代码打印“什么都没有”,甚至没有打印“空”(null)字符串。
那么,关于你的问题:
“无”是否可以表示不一定是“列表”或数组的东西?
没什么”是必然是一个(空)“列表”。然而,“空字符串”是有的。
答案2
基本上,$#
给你一些参数。 0也是一个数字,表示没有给出参数。$@
但是,扩展为空,这意味着您无法评估它。 (例如检查是否有任何参数)。自己在脚本中尝试一下,看看它的行为如何。
当您想检查提供了多少参数时,例如您的脚本会计算3个必需参数提供 - 你会的$#
。
当您需要实际使用参数执行某些操作时,您可以使用$@
.
请参阅以下示例TLDP 内部变量