Bash

Bash:擺脫每個數組成員的引用的本機方式

  • January 23, 2017

我從另一個腳本中讀取了一個數組。該數組需要放置" "所有數組成員,因為有些成員是空的。

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
   echo ${vector[index]}
done

問題是我在每個輸出行周圍都有引號,我想擺脫它們。

"red"
"blue"
"green"
""
"white"
"black"

必須改為:

red
blue
green

white
black

我尋找一種不使用awk,trsed任何其他基於管道的方法的方法。我只想使用原生方式來解決,例如使用括號、不同的標點符號……。

這可能有效:

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
   echo ${vector[index]//\"/}
done

參考:http ://www.tldp.org/LDP/abs/html/refcards.html#AEN22828

readdata.sh如果生成以換行符分隔的數據,而無需額外的引號,您將使您的程序更簡單、更健壯。

在您目前的程序中, 的輸出readdata.sh在空格處拆分(例如"a b"導致兩個數組元素"ab"),並且每個結果單詞都被解釋為萬用字元模式(例如"a * b"導致"a,然後是目前目錄中的文件名,最後是b") . 請參閱為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?更多細節。

Bash 提供了一種非常簡單的讀取換行符分隔數據的方法:mapfile內置函式。由於 bash 在子 shell 中執行管道的右側,因此您不能只編寫./readdata.sh 0 "$in_file" | mapfile -t vector,您必須將變數的使用放在命令塊中,或者您可以使用程序替換:

in_file=./data
mapfile -t vector < <(./readdata.sh 0 "$in_file")
for index in "${!vector[@]}"
do
 echo "$index: ${vector[index]}"
done

如果您不使用索引,僅使用元素,則迭代數組的更簡單方法是

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

引用自:https://unix.stackexchange.com/questions/193966