这个问题与Does the shell support sets?不同。
我知道很多脚本语言支持列表结构,比如Python、Perl、Ruby和JavaScript,那么Linux Shell呢?
Shell是否支持这样的语法?
for i in list:
do
print i
done
我首先需要初始化一个列表,例如:
ListName = [ item1, item2, ..., itemn ]
然后对它进行迭代
在编写 shell 脚本时,这是否可行?
这个问题与Does the shell support sets?不同。
我知道很多脚本语言支持列表结构,比如Python、Perl、Ruby和JavaScript,那么Linux Shell呢?
Shell是否支持这样的语法?
for i in list:
do
print i
done
我首先需要初始化一个列表,例如:
ListName = [ item1, item2, ..., itemn ]
然后对它进行迭代
在编写 shell 脚本时,这是否可行?
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
数组只是一个特殊的参数,可以包含更有结构的值列表,其中每个元素本身可以包含空格。比较一下区别:
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
for i in "${array[@]}";
会打印出3行。因为 echo ${array[@]}
只会打印一行 item 1 item 2 item 3
,所以我期望 for i in "${array[@]}";
被转换成 for i in "item 1 item 2 item 3";
;这样就会得到一行 item 1 item 2 item 3
。我错过了什么吗?谢谢。 - Svech87ksh
不支持数组?实际上它是支持的,只是语法在某些地方有些不同。这个回答及其评论并不适合解释这些差异。 - chepner要制作列表,只需这样做
colors=(red orange white "light gray")
从技术上讲,它是一个数组,但是它具有列表的所有功能。
即使Python列表也是使用数组实现的
for item in ${colors[*]}; do echo $item; done
。 - neevek"${colors[@]}"
(使用@
而非*
,并放在引号中)。 - chepner$*
在所有情况下都不能正确工作,因此不得不发明 "$@"
。 - tripleee
for item in list of items; do
结构在所有 shell 中都得到了支持。此外,方便地使用通配符循环遍历一组文件;for file in a*.dat
通过扩展通配符构建一个令牌列表(尽管不幸的是,许多用户通过执行类似于for file in $(ls a*.dat)
的操作来破坏它)。 - tripleee