溫馨提示×

溫馨提示×

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

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

shell循環(huán)中變量作用域的示例分析

發(fā)布時間:2021-05-27 11:45:20 來源:億速云 閱讀:198 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下shell循環(huán)中變量作用域的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

最近實現(xiàn)了一個shell腳本,功能簡單來說就是從文件中按行讀取然后將所有行拼接成一行寫入一個文件,關(guān)鍵代碼如下

path_all=""
cat $1 | while read line
do
 if [ "$path_all" == "" ];then
 path_all=$line
 else
 path_all=$path_all,$line
 fi
done
echo $path_all > $one_file

結(jié)果執(zhí)行結(jié)果竟然是空!按照常理shell中的變量默認(rèn)是全局變量,不會存在變量作用域的問題,于是上網(wǎng)查了下,發(fā)現(xiàn)問題出在while上

while循環(huán)讀取文件中內(nèi)容有兩種寫法,一種是管道符,一種是重定向,寫法如下

管道符:

cat $file_name | while read line
do
 #deal with line
done

重定向

while read line
do
 #deal with line
done < $file_name

這兩種做法的區(qū)別在于,重定向是內(nèi)建命令,而管道符是非內(nèi)建命令,

之所以我寫的腳本出現(xiàn)了輸出是空的問題,原因就在這里

linux執(zhí)行shell時,會創(chuàng)建“子shell”運行shell中的命令,當(dāng)運行到非內(nèi)建指令時,會創(chuàng)建“孫shell”運行非內(nèi)建指令

變量的作用于在每個shell中有效,所以,非內(nèi)建指令中定義的這些變量就只能在孫shell運行,而在子shell中不生效,所以,即便我在while中給path_all賦值了,子shell中也不會獲取到這個值。

解決這個問題的辦法有兩種,如下

如果不是必須使用管道符的方式寫while循環(huán),可以用重定向的寫法,這種寫法循環(huán)內(nèi)的變量在子shell中是生效的,比較簡便

如果非要使用管道符的方式,可以創(chuàng)建臨時文件,用于存放孫shell中的輸出

cat $file_name | while read line
do
 echo $line >> $tmp_file
done
cat $tmp_file >$one_file

雖然兩種方法都可以解決這個問題,但還是推薦第一種解決方法

以上是“shell循環(huán)中變量作用域的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

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

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

AI