在bash中解析数组时出现奇怪的结果

时间:2014-02-26 03:11:54

标签: arrays bash loops

我正在构建一个bash脚本,它从GeekTool获取信息并解析结果。到目前为止,脚本看起来像这样:

1  #!/bin/bash
2  
3  clear
4  
5  geeklets=`osascript <<TEXT
6      Tell Application "GeekTool Helper"
7          geeklets
8      End Tell
9  TEXT`
10 
11 IFS="," read -a geekletArray <<< "$geeklets"
12 
13 echo "First Element in Array:"
14 echo ${geekletArray[0]}
15 
16 echo ""
17 
18 echo "All Array Elements:"
19 for element in ${geekletArray[@]}
20 do
21     echo $element
22 done

在第14行,我回显出返回的数组的第一个元素:

shell geeklet id 49610161-0A3C-49C6-9626-694370DE3101

但是在遍历数组的循环的第一次迭代(第21行)中,第一个元素数组返回如下:

shell
geeklet
id
49610161-0A3C-49C6-9626-694370DE3101

在循环中,元素以换行符分隔列表的形式返回。

为什么会有区别?另外,如果我只想获取数组的id值(例如49610161-0A3C-49C6-9626-694370DE3101),我该如何处理呢?

谢谢!

2 个答案:

答案 0 :(得分:3)

for element in "${geekletArray[@]}"
do
   echo "$element"
done

明智地使用引号可以保护您免受不受欢迎的单词分裂。

答案 1 :(得分:2)

引用数组可能会令人困惑。您可以通过迭代数组索引来完全回避问题。

有很多方法可以从结果字符串中提取id值。我假设它将始终是以空格分隔的字符串的最后一部分。因此,我使用bash parameter expansion来有效删除所有出现的pattern *

for index in ${!geekletArray[@]}
do
    echo "${geekletArray[$index]}"       # entire element
    echo "${geekletArray[$index]##* }"   # id value only
done