欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談shell循環(huán)中變量的作用域問(wèn)題

 更新時(shí)間:2018年06月20日 15:19:14   作者:ChaosV_Ls  
今天小編就為大家分享一篇淺談shell循環(huán)中變量的作用域問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

最近實(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)刪除文件的任意列(操作代碼)

    這篇文章主要介紹了linux中sed命令實(shí)現(xiàn)刪除文件的任意列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Shell定時(shí)刪除指定時(shí)間之前的文件

    Shell定時(shí)刪除指定時(shí)間之前的文件

    這篇文章主要介紹了Shell定時(shí)刪除指定時(shí)間之前的文件,本文用來(lái)刪除一個(gè)月之前的備份文件,并加入到crontag定時(shí)刪除,需要的朋友可以參考下
    2014-12-12
  • Bash中test命令的使用

    Bash中test命令的使用

    本文主要介紹了Bash中test命令的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • shell腳本語(yǔ)言的使用(超全超詳細(xì))

    shell腳本語(yǔ)言的使用(超全超詳細(xì))

    這篇文章主要介紹了shell腳本語(yǔ)言的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • linux下python3連接mysql數(shù)據(jù)庫(kù)問(wèn)題

    linux下python3連接mysql數(shù)據(jù)庫(kù)問(wèn)題

    這篇文章主要介紹了linux下python3連接mysql數(shù)據(jù)庫(kù)問(wèn)題,需要的朋友可以參考下
    2015-10-10
  • linux sudo密碼輸入時(shí)顯示星號(hào)的操作方法

    linux 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ù)

    這篇文章主要介紹了使用shell腳本分析網(wǎng)站日志統(tǒng)計(jì)PV(瀏覽量)、404、500等數(shù)據(jù),用一個(gè)腳本來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-05-05
  • 5個(gè)實(shí)用的shell腳本面試題和答案

    5個(gè)實(shí)用的shell腳本面試題和答案

    這篇文章主要介紹了5個(gè)實(shí)用的shell腳本面試題和答案,給出的腳本堪稱編碼規(guī)范,麻雀雖小,異常處理,友好提示,一應(yīng)俱全,值得學(xué)習(xí),需要的朋友可以參考下
    2014-06-06
  • 面試必問(wèn)Linux?命令su和sudo的區(qū)別解析

    面試必問(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
  • Linux中popen函數(shù)的作用小結(jié)

    Linux中popen函數(shù)的作用小結(jié)

    popen()函數(shù)通過(guò)創(chuàng)建一個(gè)管道,調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程,執(zhí)行一個(gè)shell以運(yùn)行命令來(lái)開(kāi)啟一個(gè)進(jìn)程。這篇文章重點(diǎn)給大家介紹Linux中popen函數(shù)的作用,感興趣的朋友一起看看吧
    2018-05-05

最新評(píng)論