在一个Bash脚本中,我想把一行分成几块,并把它们存储在一个数组中。
这一行。
Paris, France, Europe
我想把它们放在一个像这样的数组中。
array[0] = Paris
array[1] = France
array[2] = Europe
我想使用简单的代码,命令的速度并不重要。我怎样才能做到这一点?
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}"
较大的负数偏移量会选择离数组末端较远的地方。注意旧版本中减号前的空格。它是必须的。
这里有一个不设置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 operator。因此,为了防止某些字符的扩展(例如*
),最好暂停这个脚本的globing。
有时,我遇到了已接受的答案中描述的方法不起作用,特别是当分隔符是回车时。 在这些情况下,我以这种方式解决。
string='first line
second line
third line'
oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $string )
IFS="$oldIFS"
for line in "${lines[@]}"
do
echo "--> $line"
done