Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux shell支持列表数据结构吗?_Linux_Bash_Shell_Ash - Fatal编程技术网

linux shell支持列表数据结构吗?

linux shell支持列表数据结构吗?,linux,bash,shell,ash,Linux,Bash,Shell,Ash,这个问题和我的不一样 我知道很多脚本语言支持列表结构,比如python、python、ruby和javascript,那么linux shell呢 shell支持这样的语法吗 for i in list: do print i done 我首先要初始化一个列表,例如: ListName = [ item1, item2, ..., itemn ] 然后对其进行迭代 在编写shell脚本时,这可能吗?要创建列表,只需这样做即可 colors=(red orange white "li

这个问题和我的不一样

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

shell支持这样的语法吗

for i in list:
do
     print i
done
我首先要初始化一个列表,例如:

ListName = [ item1, item2, ..., itemn ]
然后对其进行迭代


在编写shell脚本时,这可能吗?

要创建列表,只需这样做即可

colors=(red orange white "light gray")
从技术上讲,它是一个数组,但-当然-它具有所有列表功能。

甚至python列表也是用数组实现的,它支持列表,但不支持作为单独的数据结构(暂时忽略数组)

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
数组只是一个特殊的参数,它可以包含一个更结构化的值列表,其中每个元素本身都可以包含空格。比较差异:

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

要遍历数组,请对${colors[*]}中的项使用
;不要重复$item;完成
@Neevek,它不会做你认为它会做的事;“浅灰色”将被视为“浅”和“灰色”两项。您需要使用
“${colors[@]}”
@
不是
*
,并引用)。为什么使用*时“浅灰色”将被视为两项?我在哪里可以找到这些细节的文件?man sh?基本上这是一个历史缺陷,Bourne shell中的
$*
在所有情况下都不能正常工作,因此必须发明
“$@”
。还要注意的是,Bourne shell/POSIX shell没有数组。但项目列表中项目的
;do
construct当然在所有shell中都受支持。还请注意,可以方便地使用globbing在一组文件上循环
for file in a*.dat
通过扩展通配符来构建令牌列表(尽管遗憾的是,许多用户通过对file in$(ls a*.dat))执行类似于
的操作来破坏它)。@是什么意思?它是一个特殊的索引,导致扩展生成数组的所有元素,不仅仅是一个特定的元素。我不明白为什么“${array[@]}”中的I是
打印3行。由于
echo${array[@]}
只打印一行
item 1 item 2 item 3
,我希望“${array[@]}”中的I的
中转换为“第1项第2项第3项”中的i;因此,它将导致一行
项目1项目2项目3
。我错过了什么?提前感谢
“${array[*]}”
将扩展到
“项目1项目2项目3”
<代码>“${array[@]}”
扩展为
“项目1”“项目2”“项目3”
;它将每个元素视为单独的带引号的单词,而不是包含每个元素的单个带引号的单词。array仅在bash shell中工作。有没有办法在KSH实现同样的目标?