您好,登錄后才能下訂單哦!
小編給大家分享一下shell循環中變量作用域的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
最近實現了一個shell腳本,功能簡單來說就是從文件中按行讀取然后將所有行拼接成一行寫入一個文件,關鍵代碼如下
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
結果執行結果竟然是空!按照常理shell中的變量默認是全局變量,不會存在變量作用域的問題,于是上網查了下,發現問題出在while上
while循環讀取文件中內容有兩種寫法,一種是管道符,一種是重定向,寫法如下
管道符:
cat $file_name | while read line do #deal with line done
重定向
while read line do #deal with line done < $file_name
這兩種做法的區別在于,重定向是內建命令,而管道符是非內建命令,
之所以我寫的腳本出現了輸出是空的問題,原因就在這里
linux執行shell時,會創建“子shell”運行shell中的命令,當運行到非內建指令時,會創建“孫shell”運行非內建指令
變量的作用于在每個shell中有效,所以,非內建指令中定義的這些變量就只能在孫shell運行,而在子shell中不生效,所以,即便我在while中給path_all賦值了,子shell中也不會獲取到這個值。
解決這個問題的辦法有兩種,如下
如果不是必須使用管道符的方式寫while循環,可以用重定向的寫法,這種寫法循環內的變量在子shell中是生效的,比較簡便
如果非要使用管道符的方式,可以創建臨時文件,用于存放孫shell中的輸出
cat $file_name | while read line do echo $line >> $tmp_file done cat $tmp_file >$one_file
雖然兩種方法都可以解決這個問題,但還是推薦第一種解決方法
以上是“shell循環中變量作用域的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。