2013-03-28 96 views
8

這是我如何創建我的bash數組:如何在BASH中從數組中提取特定元素?

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

文件「lines.txt」下列字符串constists

hello big world! 
how are you 
where am I 

創造${myarr[@]}後,我可以輕鬆地訪問每一個元素(行)在這個陣列發行

echo ${myarr[2]} 

但是,如果我只想提取world!?是否可以從myarr的0元素中提取world!?什麼是最重要的,是否有可能從myarr元素中提取任何最後一個單詞?

我知道,在Python中,你可以做myarr[0][3]和會做的伎倆,怎麼樣的bash?

+0

數組元素是字符串 - 行的副本。他們本身並不是單詞或任何東西的陣列。如果您願意,可以將數組元素分開,但不會自動將數組元素拆分爲單詞。 –

+0

是啊,這是有道理的 – minerals

回答

6

這是使用改性劑在變量擴展許多方式

set ${myarr[2]} 
echo $3 
+1

推薦:'設置 - $ {mayarr [2]}'這樣,如果在數組元素的值是'-x -e',你的shell不啓動跟蹤和錯誤退出。 –

+5

'a =($ {myarr [2]}); echo $ {a [3]}'是等價的,並且不會覆蓋您可能用於其他事情的shell /函數位置參數。 – chepner

5

可以從字符串中提取字(這是數組元素是)之一:#(刪除前綴),##(刪除前綴,貪婪),%(刪除後綴)和%%(刪除後綴,貪婪)。

$ 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! 

正如你所看到的,你可以得到相當看中這裏,而是把它變成一個數組的某一點@ chepner的建議變得容易得多。另外,我建議提取第二等字的公式是有點脆弱:如果你用我的公式來提取只有兩個詞串的第三個詞,第一調整會失敗,而且會風打印第一個(!)單詞而不是空白。另外,如果你在一排有兩個空格,這將把它作爲與在它兩側的空間零長度字...

BTW,構建陣列時,我認爲這是一個有點清潔劑使用+=(newelement)而不是明確地跟蹤數組索引:

myarr=() 
while read line, do 
    myarr+=("$line") 
done < lines.txt