簡體   English   中英

如何從命令輸出的行創建數組

[英]How to create an array from the lines of a command's output

我有一個名為failedfiles.txt的文件,其中包含以下內容:

failed1
failed2
failed3

我需要使用grep返回該文件中每行的內容,並將輸出保存在要訪問的列表中。 所以我想要這樣的東西:

temp_list=$(grep "[a-z]" failedfiles.txt)

但是,這個問題是我打字的時候

echo ${temp_list[0]}

我得到以下輸出:

failed1 failed2 failed3

但我想要的是當我這樣做時:

echo ${temp_list[0]}

打印

failed1

當我這樣做時:

echo ${temp_list[1]}

打印

failed2

謝謝。

@ devnull的有用答案解釋了為什么你的代碼沒有按預期工作:命令替換總是返回一個字符串 (可能由多行組成)。

但是, 如果命令輸出的行沒有嵌入空格只需在命令替換周圍放置(...)來創建一個數組只會按預期工作 - 否則,每個單獨的(以空格分隔的)單詞將成為它的自己的數組元素。


陣列中一次捕獲命令輸出行:

要捕獲數組中任意命令輸出的行,請使用以下命令:

  • bash <4 (例如,從OS X 10.9.2開始的OSX上):使用read -a
IFS=$'\n' read -rd '' -a linesArray <<<"$(grep "[a-z]" failedfiles.txt)"
  • bash> = 4 :使用readarray
readarray -t linesArray <<<"$(grep "[a-z]" failedfiles.txt)"

注意:

  • <<<啟動一個所謂的here-string ,它將字符串右側(這恰好是命令替換的結果)通過stdin傳遞到左側的命令中。
    • command <<< string在功能上等同於echo string | command 原則上echo string | command ,關鍵的區別在於后者創建了子殼 ,這使得command變量賦值毫無意義 - 它們被本地化到每個子殼。
  • 將here-strings和命令替換組合在一起的另一種方法是[輸入] 進程替換 - <(...) - 簡單地說,它允許使用命令的輸出,就像它是一個輸入文件一樣; 相當於<<<"$(command)"< <(command)
  • read-a讀入數組, IFS=$'\\n'確保每一行都被視為一個單獨的字段,從而讀入自己的數組元素; -d ''確保一次讀取所有行(在將它們分成字段之前); -r在輸入off中轉換對轉義序列的解釋。
  • readarray (也可以作為mapfile調用)直接將輸入行分成一個行數組; -t確保終止\\n不包含在數組元素中。

循環命令輸出行:

如果不需要一次捕獲數組中的所有行並且逐行循環遍歷命令的輸出就足夠了,請使用以下命令:

while IFS= read -r line; do
  # ...
done < <(grep "[a-z]" failedfiles.txt)
  • IFS=確保每行都以空白方式不加修改地讀取; 刪除它以修剪前導和尾隨空格。
  • -r確保在輸入中看起來像轉義序列的子串中讀取“原始”行 - 例如, \\t - 不被解釋為這樣。
  • 注意使用[輸入]進程替換(如上所述)來提供命令輸出作為read循環的輸入。

沒有創建一個數組。 你所做的是命令替換 ,它只是將命令的輸出放入變量中

為了創建一個數組,請說:

temp_list=( $(grep "[a-z]" failedfiles.txt) )

您可能還想參考陣列指南

在文件中循環遍歷的正確且可移植的方法很簡單

while read -r line; do
    ... something with "$line"
done <failedfiles.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM