問題描述
這是命令:pdc status -a 2>&1 | grep 'okay'
它給出以下輸出
[okay ]: you are currently listening: 33
[okay ]: you are currently listening: 22
[okay ]: you are currently listening: 11
我已經在 shell 腳本文件中編寫了這個命令。但我想將此命令的輸出存儲到數組中,以便對數組中的每個索引值進行一些處理。
如何將此命令的輸出存儲到數組中?
最佳回答
如果您隻想要每行末尾的數字:
numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )
如果要將每一行存儲到數組中
mapfile -t lines < <(pdc ...)
要從數組中檢索數據:
for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11
[okay ]: you are currently listening: 33
[okay ]: you are currently listening: 22
[okay ]: you are currently listening: 11
次佳回答
首先,您不一定需要數組,要逐行處理輸出,您可以這樣做:
pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done
如果您確實需要陣列,Glenn Jackman already gave 您是最好的方法,但這是另一種方法:
#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))
解釋:
-
$IFS=$'\n'
:$IFS
是 bash 的 input field separator ,將其設置為僅換行符(\n
)可確保您的輸出行不會在空格上拆分,以便您可以將每一行保存為單獨的數組元素。沒有這個,你的命令輸出的每個單詞都會是一個不同的元素。根據您想要執行的操作,保存
$IFS
的舊值並在讀取數組後恢複它可能是個好主意:oldifs="$IFS" IFS=$'\n' array=($(echo -e "foo bar\nbaz bar")) IFS="$oldifs"
-
$(command)
:這稱為 command substitution,允許您將命令的輸出保存在變量中。有兩種方法可以做到這一點:var=$(command)
和
var=`command`
在這兩種方法中,
$()
更好,因為:-
它可以處理嵌套命令:
var=$(command1 $(command 2))
例如
var=$(cat $(find ~/))
-
它在引用方麵的問題要少得多,並且語法更清晰。有關更多信息,請參見 here。
-
第三種回答
使用 readarray
內置的另一種更直觀的方式(參見 help -m readarray
):
readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"
接下來,要打印一個數組元素,比如說第二個元素,您可以使用:
echo "${array[1]}"
要在單獨的行上打印所有數組元素,可以使用:
printf -- "%s\n" "${array[@]}"