如何从BASH中的数组中提取特定元素?

时间:2013-03-28 15:23:59

标签: arrays bash

以下是我创建bash数组的方法:

while read line
do
   myarr[$index]=$line
   index=$(($index+1))
done < lines.txt

“lines.txt”文件是以下字符串

的组成部分
hello big world!
how are you
where am I

创建${myarr[@]}后,我可以轻松访问此阵列发布中的每个元素(行)

echo ${myarr[2]}

但是,如果我只想提取world!怎么办?是否可以从world!的0元素中提取myarr?最重要的是,是否可以从myarr元素中提取任何最后一个单词?

我知道在python中你可以做myarr[0][3]这样就可以了,bash怎么样?

4 个答案:

答案 0 :(得分:15)

这是众多方式之一

set ${myarr[2]}
echo $3

答案 1 :(得分:5)

您可以使用变量扩展中的修饰符从字符串中提取单词(这是数组元素所在的单词):#(删除前缀),##(删除前缀,贪婪),{{ 1}}(删除后缀)和%(删除后缀,贪婪)。

%%

正如你所看到的,你可以在这里得到相当的幻想,但在某些时候@chepner建议把它变成一个数组变得容易了。此外,我建议用于提取第二个等词的公式有点脆弱:如果你使用我的公式提取只有两个单词的字符串的第三个单词,第一个修剪将失败,它将结束打印第一个(!)字而不是空白。另外,如果你连续有两个空格,这会将它视为一个零长度的单词,每一行都有一个空格......

BTW,在构建数组时我认为使用$ myarr=('hello big world!' 'how are you' 'where am I') $ echo "${myarr[0]}" # Entire first element of the array hello big world! $ echo "${myarr[0]##* }" # To get the last word, remove prefix through the last space world! $ echo "${myarr[0]%% *}" # To get the first word, remove suffix starting with the first space hello $ tmp="${myarr[0]#* }" # The second word is harder; first remove through the first space... $ echo "${tmp%% *}" # ...then get the first word of what remains big $ tmp="${myarr[0]#* * }" # The third word (which might not be the last)? remove through the second space... $ echo "${tmp%% *}" # ...then the first word again world! 而不是明确跟踪数组索引有点清晰:

+=(newelement)

答案 2 :(得分:1)

类似于stephen-penny's的答案,但没有覆盖shell /函数位置参数。

a=(${myarr[2]})
echo ${a[3]}

答案 3 :(得分:0)

使用索引从数组中打印特定元素:

echo ${my_array[2]}

要打印数组中的所有元素,请执行以下操作:

for i in "${my_array[@]}"
do
    echo $i
done