在一个Bash脚本中,我想将一行分成几块,并把它们放入一个数组中。
该行:
Paris, France, Europe
我想让他们像这样的数组:
array[0] = Paris
array[1] = France
array[2] = Europe
我想用简单的代码,命令的速度并不重要。我该怎么做?
这是没有设置IFS的方法:
string="1:2:3:4:5"
set -f # avoid globbing (expansion of *).
array=(${string//:/ })
for i in "${!array[@]}"
do
echo "$i=>${array[i]}"
done
这个想法是使用字符串替换:
${string//substring/replacement}
用空格替换$ substring的所有匹配,然后使用替换的字符串来初始化一个数组:
(element1 element2 ... elementN)
注意:这个答案使用了split + glob操作符。因此,为了防止某些字符(如*)的扩展,暂停此脚本的通配是一个好主意。
IFS=', ' read -r -a array <<< "$string"
另外,在字符$IFS被单独视为分离器,使得在这种情况下,字段可以由被分离或者逗号或空间而不是两个字符的序列。有趣的是,当输入中出现逗号空格时,空字段不会被创建,因为空间被专门处理。
要访问一个单独的元素:
echo "${array[0]}"
迭代元素:
for element in "${array[@]}"
do
echo "$element"
done
要同时获得索引和值:
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
最后一个例子是有用的,因为Bash数组是稀疏的。换句话说,你可以删除一个元素或添加一个元素,然后索引不是连续的。
unset "array[1]"
array[42]=Earth
要获取数组中元素的数量:
echo "${#array[@]}"
如上所述,数组可以是稀疏的,所以你不应该使用长度来获得最后一个元素。以下是您可以在Bash 4.2和更高版本中使用的方法:
echo "${array[-1]}"
在任何版本的Bash(从2.05b之后的某处):
echo "${array[@]: -1:1}"
较大的负偏移距离阵列末端较远。请注意旧版本中减号前的空格。这是必需的。