[英]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的有用答案解釋了為什么你的代碼沒有按預期工作:命令替換總是返回一個字符串 (可能由多行組成)。
但是, 如果命令輸出的行沒有嵌入空格 , 只需在命令替換周圍放置(...)
來創建一個行數組只會按預期工作 - 否則,每個單獨的(以空格分隔的)單詞將成為它的自己的數組元素。
要捕獲數組中任意命令輸出的行,請使用以下命令:
read -a
IFS=$'\n' read -rd '' -a linesArray <<<"$(grep "[a-z]" failedfiles.txt)"
readarray
: readarray -t linesArray <<<"$(grep "[a-z]" failedfiles.txt)"
注意:
<<<
啟動一個所謂的here-string ,它將字符串右側(這恰好是命令替換的結果)通過stdin
傳遞到左側的命令中。
command <<< string
在功能上等同於echo string | command
原則上echo string | command
,關鍵的區別在於后者創建了子殼 ,這使得command
變量賦值毫無意義 - 它們被本地化到每個子殼。 <(...)
- 簡單地說,它允許使用命令的輸出,就像它是一個輸入文件一樣; 相當於<<<"$(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
循環的輸入。 在文件中循環遍歷的正確且可移植的方法很簡單
while read -r line; do
... something with "$line"
done <failedfiles.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.