您好,登錄后才能下訂單哦!
本篇內容主要講解“如何理解bash readarray”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解bash readarray”吧!
工作中有如下需求,要去解析一個文件的內容,但文件是json格式的,我不想使用jq。通過grep過濾出符合要求的行,然后在for循環中處理它們。 然后發現,這樣實現不行。
lines=$(grep xxxx /path/to/file.json) for line in ${lines}; do echo ${line} done
grep輸出的內容變成一行了。對比運行環境和ubuntu中,發現lines的內容不同。在運行環境中是一行(換行符消失了),在ubuntu是多行。換了sed之后,確認是bash實現的問題。不能去更新運行環境中bash的版本,就只能考慮其他實現方式了。
查了資料之后發現readarray,一個bash的內置函數,可以實現這個需求,它還有個別名叫mapfile。個人感覺readarray更好理解一些。 它的實方式如下:
# 聲明它是個列表 delcare -a lines readarray -t lines < <(grep xxx /path/to/file.json) for line in "${lines[@]}"; do echo "${line}" done
盡管解決過程很短,readarry這種調用形式之前也見過一直不明白,為什么會是這種形式。
< <(grep xxx /path/to/file.json)
而且,兩個<
之間一定要有一個空格。第2個<
要與小括號緊挨著。終于通過查看bash manual找到了答案。
之前也查過,沒有找到。這次通過<\(
在man bash中搜索到了。原文如下 :
Process Substitution Process substitution allows a process's input or output to be referred to using a filename. It takes the form of <(list) or >(list). The process list is run asynchronously, and its input or output appears as a filename. This filename is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list. Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic expansion.
意思是說,<(cmd)這種形式是進程替換的一種形式。<(cmd)可以作為一個文件出現。它是通過命名管道實現的。它出現的地方可以用一個文件來代替。 這也是為什么它可以在 <
后出現。相當于是把文件的內容重定向到前一個命令的標準輸入中了。這個過程是異步的,()
中的命令可能先執行完。
疑問解答:
為什么<
之間要有空格?因為<(cmd)是固定形式。
第1個<
是什么作用?是輸入重定向,將后面的文件的描述符,重定向到前面的命令的標準輸入。
如何解釋echo <(ls)
的輸出是/proc/self/fd/11
?這也驗證之前的說明,<(ls)是一個文件描述符,bash里的實現應該是從文件描述符中read,然后write到前面的命令標準輸入中。與文件重定向的區別是,bash會自動區分,輸入的是文件描述符還是文件。文件就先打開再讀,描述符就直接讀。
到此,相信大家對“如何理解bash readarray”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。