淺談shell循環(huán)中變量的作用域問(wèn)題
最近實(shí)現(xiàn)了一個(gè)shell腳本,功能簡(jiǎn)單來(lái)說(shuō)就是從文件中按行讀取然后將所有行拼接成一行寫(xiě)入一個(gè)文件,關(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)是全局變量,不會(huì)存在變量作用域的問(wèn)題,于是上網(wǎng)查了下,發(fā)現(xiàn)問(wèn)題出在while上
while循環(huán)讀取文件中內(nèi)容有兩種寫(xiě)法,一種是管道符,一種是重定向,寫(xiě)法如下
管道符:
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ě)的腳本出現(xiàn)了輸出是空的問(wèn)題,原因就在這里
linux執(zhí)行shell時(shí),會(huì)創(chuàng)建“子shell”運(yùn)行shell中的命令,當(dāng)運(yùn)行到非內(nèi)建指令時(shí),會(huì)創(chuàng)建“孫shell”運(yùn)行非內(nèi)建指令
變量的作用于在每個(gè)shell中有效,所以,非內(nèi)建指令中定義的這些變量就只能在孫shell運(yùn)行,而在子shell中不生效,所以,即便我在while中給path_all賦值了,子shell中也不會(huì)獲取到這個(gè)值。
解決這個(gè)問(wèn)題的辦法有兩種,如下
如果不是必須使用管道符的方式寫(xiě)while循環(huán),可以用重定向的寫(xiě)法,這種寫(xiě)法循環(huán)內(nèi)的變量在子shell中是生效的,比較簡(jiǎn)便
如果非要使用管道符的方式,可以創(chuàng)建臨時(shí)文件,用于存放孫shell中的輸出
cat $file_name | while read line do echo $line >> $tmp_file done cat $tmp_file >$one_file
雖然兩種方法都可以解決這個(gè)問(wèn)題,但還是推薦第一種解決方法
以上這篇淺談shell循環(huán)中變量的作用域問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux?中sed命令實(shí)現(xiàn)刪除文件的任意列(操作代碼)
這篇文章主要介紹了linux中sed命令實(shí)現(xiàn)刪除文件的任意列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06linux下python3連接mysql數(shù)據(jù)庫(kù)問(wèn)題
這篇文章主要介紹了linux下python3連接mysql數(shù)據(jù)庫(kù)問(wèn)題,需要的朋友可以參考下2015-10-10linux sudo密碼輸入時(shí)顯示星號(hào)的操作方法
在輸入linux sudo密碼的時(shí)候終端是不顯示任何東西的,我們不知道我們按下的密碼到底輸入進(jìn)去了沒(méi)有,如果可以像在網(wǎng)站上登錄賬號(hào)密碼的時(shí)候顯示星號(hào)多好,下面小編給大家介紹下linux sudo密碼輸入時(shí)顯示星號(hào)的操作方法2018-01-01使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV、404、500等數(shù)據(jù)
這篇文章主要介紹了使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV(瀏覽量)、404、500等數(shù)據(jù),用一個(gè)腳本來(lái)實(shí)現(xiàn),需要的朋友可以參考下2014-05-05面試必問(wèn)Linux?命令su和sudo的區(qū)別解析
之前一直對(duì)?su?和?sudo?這兩個(gè)命令犯迷糊,最近專門(mén)搜了這方面的資料,總算是把兩者的關(guān)系以及用法搞清楚了,這篇文章來(lái)系統(tǒng)總結(jié)一下,對(duì)Linux?命令su和sudo相關(guān)知識(shí)感興趣的朋友一起看看吧2022-07-07