2012-09-07 47 views
26

这个问题不一样Does the shell support sets?linux shell支持列表数据结构吗?

我知道很多脚本语言的支持列表结构,比如python,python,ruby和javascript,那么linux shell怎么样?

确实shell支持这样的语法吗?

for i in list: 
do 
    print i 
done 

我会先初始化列表,例如:

ListName = [ item1, item2, ..., itemn ] 

然后遍历它

编程shell脚本时,这可能吗?

+1

另请注意,Bourne shell/POSIX shell没有数组。但是'项目列表中的项目;所有炮弹当然都支持这种构造。还要注意globbing方便地使用循环遍历一组文件; '* .dat'中的文件通过扩展通配符来构造一个令牌列表(尽管令人遗憾的是,许多用户通过执行诸如'for(ls a * .dat)'中的文件''来破坏它。 – tripleee

回答

45

它支持列表,但不支持单独的数据结构(忽略当前的数组)。

空格分隔值的一个列表的for循环迭代(在一般意义上),不管如何被创建列表,是否字面上:

for i in 1 2 3; do 
    echo "$i" 
done 

或通过参数扩展:

listVar="1 2 3" 
for i in $listVar; do 
    echo "$i" 
done 

或命令替换:

for i in $(echo 1; echo 2; echo 3); do 
    echo "$i" 
done 

的ARRA y只是一个特殊的参数,它可以包含更多结构化的值列表,其中每个元素本身可以包含空格。比较差异:

array=("item 1" "item 2" "item 3") 
for i in "${array[@]}"; do # The quotes are necessary here 
    echo "$i" 
done 

list='"item 1" "item 2" "item 3"' 
for i in $list; do 
    echo $i 
done 
for i in "$list"; do 
    echo $i 
done 
for i in ${array[@]}; do 
    echo $i 
done 
+0

@是什么意思? –

+2

这是一个特殊的索引,它使扩展生成数组的所有元素,而不仅仅是一个特定的元素。 – chepner

+0

我没有得到为什么'为我在“$ {array [@]}”;'打印3行。因为'echo $ {array [@]}'打印一行'item 1 item 2 item 3',所以我期望'for {in {$ array {@]}“;'被转换为'for i in “项目1项目2项目3”;';所以它会导致一行'项目1项目2项目3'。我错过了什么?在此先感谢 – Svech87

7

对于做一个列表,只要做到这一点

colors=(red orange white "light gray") 

从技术上讲是一个数组,但 - 当然 - 它拥有所有列表功能。
即使是Python列表也使用数组实现

+1

要遍历数组,使用'for item in $ {colors [*]};做echo $ item;完成' – neevek

+8

@Neevek不会做你认为它的事情; “浅灰色”将被视为“浅色”和“灰色”两项。你需要使用''$ {colors [@]}“'('@'而不是'*'和引号)。 – chepner

+0

为什么当使用*时,“浅灰色”将被视为两个项目?我可以在哪里找到这些细节的文件?男人是谁? – hugemeow