小編給大家分享一下shell循環(huán)中變量作用域的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
最近實(shí)現(xiàn)了一個(gè)shell腳本,功能簡(jiǎn)單來(lái)說(shuō)就是從文件中按行讀取然后將所有行拼接成一行寫入一個(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)容有兩種寫法,一種是管道符,一種是重定向,寫法如下
管道符:
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)了輸出是空的問(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)題的辦法有兩種,如下
如果不是必須使用管道符的方式寫while循環(huán),可以用重定向的寫法,這種寫法循環(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)中變量作用域的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章標(biāo)題:shell循環(huán)中變量作用域的示例分析-創(chuàng)新互聯(lián)
文章URL:http://jinyejixie.com/article34/dejjpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)、云服務(wù)器、網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
移動(dòng)網(wǎng)站建設(shè)知識(shí)