溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解bash readarray

發(fā)布時(shí)間:2021-10-14 14:30:51 來(lái)源:億速云 閱讀:381 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“如何理解bash readarray”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解bash readarray”吧!

§ 0x01 起源

工作中有如下需求,要去解析一個(gè)文件的內(nèi)容,但文件是json格式的,我不想使用jq。通過(guò)grep過(guò)濾出符合要求的行,然后在for循環(huán)中處理它們。 然后發(fā)現(xiàn),這樣實(shí)現(xiàn)不行。

lines=$(grep xxxx /path/to/file.json)
for line in ${lines}; do
	echo ${line}
done

grep輸出的內(nèi)容變成一行了。對(duì)比運(yùn)行環(huán)境和ubuntu中,發(fā)現(xiàn)lines的內(nèi)容不同。在運(yùn)行環(huán)境中是一行(換行符消失了),在ubuntu是多行。換了sed之后,確認(rèn)是bash實(shí)現(xiàn)的問(wèn)題。不能去更新運(yùn)行環(huán)境中bash的版本,就只能考慮其他實(shí)現(xiàn)方式了。

§ 0x02 readarry

查了資料之后發(fā)現(xiàn)readarray,一個(gè)bash的內(nèi)置函數(shù),可以實(shí)現(xiàn)這個(gè)需求,它還有個(gè)別名叫mapfile。個(gè)人感覺(jué)readarray更好理解一些。 它的實(shí)方式如下:

# 聲明它是個(gè)列表
delcare -a lines
readarray -t lines < <(grep xxx /path/to/file.json)
for line in "${lines[@]}"; do
	echo "${line}"
done

盡管解決過(guò)程很短,readarry這種調(diào)用形式之前也見(jiàn)過(guò)一直不明白,為什么會(huì)是這種形式。

< <(grep xxx /path/to/file.json)

而且,兩個(gè)<之間一定要有一個(gè)空格。第2個(gè)<要與小括號(hào)緊挨著。終于通過(guò)查看bash manual找到了答案。

§ 0x03 釋疑

之前也查過(guò),沒(méi)有找到。這次通過(guò)<\(在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.

意思是說(shuō),<(cmd)這種形式是進(jìn)程替換的一種形式。<(cmd)可以作為一個(gè)文件出現(xiàn)。它是通過(guò)命名管道實(shí)現(xiàn)的。它出現(xiàn)的地方可以用一個(gè)文件來(lái)代替。 這也是為什么它可以在 <后出現(xiàn)。相當(dāng)于是把文件的內(nèi)容重定向到前一個(gè)命令的標(biāo)準(zhǔn)輸入中了。這個(gè)過(guò)程是異步的,()中的命令可能先執(zhí)行完。

疑問(wèn)解答:

  1. 為什么<之間要有空格?因?yàn)?lt;(cmd)是固定形式。

  2. 第1個(gè)<是什么作用?是輸入重定向,將后面的文件的描述符,重定向到前面的命令的標(biāo)準(zhǔn)輸入。

  3. 如何解釋echo <(ls)的輸出是/proc/self/fd/11?這也驗(yàn)證之前的說(shuō)明,<(ls)是一個(gè)文件描述符,bash里的實(shí)現(xiàn)應(yīng)該是從文件描述符中read,然后write到前面的命令標(biāo)準(zhǔn)輸入中。與文件重定向的區(qū)別是,bash會(huì)自動(dòng)區(qū)分,輸入的是文件描述符還是文件。文件就先打開(kāi)再讀,描述符就直接讀。

到此,相信大家對(duì)“如何理解bash readarray”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI