【发布时间】:2019-03-24 20:32:49
【问题描述】:
我在这里搜索了一个类似的问题,但令人惊讶的是找不到任何问题。
在 GNU bash 中,有一个(构造?结构?数据类型?)称为“arrays”。数组在 bash 文档中有很好的记录,所以我认为我了解基础知识。
但突然,在文档中也出现了“列表”一词。例如,在谈论filename expansion时使用它(重点是我的):
如果出现这些字符之一,则该词被视为一个模式,并替换为按字母顺序排列的与该模式匹配的文件名列表(请参阅模式匹配)。
因此,我有三个问题:
- 这里的“列表”是什么意思?
- 它的用法和for loop description的意思一样吗?
- 我不知何故迷失在 bash 的空白世界中。如果这个“列表”是一个独立于数组的概念(我认为),那么在涉及空格和
IFS时是否会对其进行特殊处理,或者与数组的处理方式相同?
another use of the "list" term 在谈论一个或多个管道的序列时,但我知道它很可能意味着不同类型的列表。
更新
- 因为我看到这种“列表结构”的工作方式与数组的工作方式非常相似——它们之间有什么区别?
更新 2
-
当“列表”优先于数组时,哪些用例是首选?例如,让我们比较一下。让我们创建两个文件:
$ touch file1.txt file2.txt
说到列表,我可以做到以下几点:
$ A=*.txt ; echo $A
file1.txt file2.txt
$
当涉及到数组时,我可以做到以下几点:
$ B=(*.txt) ; echo ${B[@]}
file1.txt file2.txt
$
虽然这两个结果完全相同,但是否存在数组和列表返回不同结果的情况?
更新 3
我可能会混淆某些东西,因为在上面的示例中,它似乎是一个“包装”在数组中的列表。不知道有没有影响。
【问题讨论】:
-
在更新 2 中,它们只是相同的,因为您有两个不包含空格的文件名。尝试创建一些确实在其名称中包含空格的文件,然后比较
printf '%s\n' $A、printf '%s\n' ${B[@]}、printf '%s\n' "$A"和printf '%s\n' "${B[@]}"。 -
谢谢,@chepner。我看到还有一点是用什么工具来展示的。这符合我对从我的最后第二条评论到 codeforester 答案的列表的理解,即 Bash 是为了 treat 某些东西作为一个列表,而不是 define 作为列表的东西。 - 顺便说一句,好吧,已经有一段时间了,所以在你发表评论之后,我不得不回忆所有这些线程。但很高兴认识到我已经(几乎)理解了它。 ;)