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

首頁 > 開發 > Linux Shell > 正文

淺談shell循環中變量的作用域問題

2020-07-27 18:47:28
字體:
來源:轉載
供稿:網友

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

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

結果執行結果竟然是空!按照常理shell中的變量默認是全局變量,不會存在變量作用域的問題,于是上網查了下,發現問題出在while上

while循環讀取文件中內容有兩種寫法,一種是管道符,一種是重定向,寫法如下

管道符:

cat $file_name | while read linedo #deal with linedone

重定向

while read linedo #deal with linedone < $file_name

這兩種做法的區別在于,重定向是內建命令,而管道符是非內建命令,

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

linux執行shell時,會創建“子shell”運行shell中的命令,當運行到非內建指令時,會創建“孫shell”運行非內建指令

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

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

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

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

cat $file_name | while read linedo echo $line >> $tmp_filedonecat $tmp_file >$one_file

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

以上這篇淺談shell循環中變量的作用域問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屯留县| 榆社县| 青州市| 铜陵市| 宜兰县| 武安市| 镇安县| 乳源| 绥中县| 蓬莱市| 敦化市| 宁津县| 大埔区| 丹东市| 泰顺县| 白水县| 安义县| 合作市| 滨州市| 山阴县| 宜兴市| 屯昌县| 榆林市| 黄大仙区| 英超| 兴化市| 新建县| 呼和浩特市| 吴川市| 惠东县| 东山县| 石台县| 松原市| 乌什县| 邢台县| 沅陵县| 沽源县| 河南省| 南宁市| 丹棱县| 沧源|