how differently do an empty string and a list with 0 elements behave?

how differently do an empty string and a list with 0 elements behave?

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 内部变量

相关内容