Bash
Bash:擺脫每個數組成員的引用的本機方式
我從另一個腳本中讀取了一個數組。該數組需要放置
" "
所有數組成員,因為有些成員是空的。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
,tr
或sed
任何其他基於管道的方法的方法。我只想使用原生方式來解決,例如使用括號、不同的標點符號……。
這可能有效:
in_file=./data vector=($(./readdata.sh 0 $in_file)) for index in ${!vector[@]} do echo ${vector[index]//\"/} done
readdata.sh
如果生成以換行符分隔的數據,而無需額外的引號,您將使您的程序更簡單、更健壯。在您目前的程序中, 的輸出
readdata.sh
在空格處拆分(例如"a b"
導致兩個數組元素"a
和b"
),並且每個結果單詞都被解釋為萬用字元模式(例如"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