2014-02-26 49 views
2

我在构建一个bash脚本,它从GeekTool获取信息并分析结果。迄今脚本看起来像这样:在bash中解析数组时出现了奇怪的结果

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),我将如何处理它?

谢谢!

+1

'对于$ {array [@]}中的元素'' - 双引号是强制性的。 –

+0

...另请参阅http://shellcheck.net/ –

回答

2

引用数组会引起混淆。您可以通过遍历数组索引来完全避开问题。

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

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

明智地使用引号的所有匹配会保护你从不需要分词。

相关问题