国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Linux > 正文

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

2019-10-26 18:57:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

path_all=""cat $1 | while read linedo if [ "$path_all" == "" ];then path_all=$line else path_all=$path_all,$line fidoneecho $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 linedo #deal with linedone

重定向

while read linedo #deal with linedone < $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 linedo echo $line >> $tmp_filedonecat $tmp_file >$one_file

雖然兩種方法都可以解決這個(gè)問(wèn)題,但還是推薦第一種解決方法

以上這篇淺談shell循環(huán)中變量的作用域問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林站長(zhǎng)站。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 德清县| 枣庄市| 青神县| 澄城县| 永德县| 福泉市| 长垣县| 锡林郭勒盟| 阳信县| 竹山县| 交城县| 屏山县| 洞头县| 余庆县| 长泰县| 天水市| 瑞金市| 鄂温| 孟津县| 台湾省| 顺义区| 青铜峡市| 耒阳市| 湄潭县| 紫金县| 娄底市| 海丰县| 桦南县| 固安县| 广灵县| 长寿区| 乐山市| 五台县| 新蔡县| 左云县| 阳泉市| 习水县| 应城市| 凌源市| 通道| 镇雄县|