當前位置: 首頁>>技術教程>>正文


scripts – 將命令的輸出存儲到數組中

問題描述

這是命令: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[@]}"

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12405.html,未經允許,請勿轉載。