shell迴圈中變數的作用域問題

2021-08-04 05:37:16 字數 1095 閱讀 6278

最近實現了乙個shell指令碼,功能簡單來說就是從檔案中按行讀取然後將所有行拼接成一行寫入乙個檔案,關鍵**如下

path_all=""

cat $1 | while read line

doif [ "$path_all" == "" ];then

path_all=$line

else

path_all=$path_all,$line

fidone

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

doecho $line >> $tmp_file

done

cat $tmp_file >$one_file

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

for迴圈中的變數作用域

for語句的語法如下 for expression1 expression2 expression3 statement expression1為初始化部分,它在迴圈裡只在開始時執行一次 expression2為條件部分,它在迴圈中每次都被執行。expression3 為調整部分,它在迴圈體每次執行...

shell變數作用域

在shell中定義函式可以使 模組化,便於復用 不過指令碼本身的變數和函式 的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或 被顯示刪除的地方為止。例1 指令碼變數的作用域 bin bash de...

Shell變數作用域

變數作用域就是變數的有效範圍,shell中變數作用域有三種 1.全域性變數 在當前shell中任何地方使用的變數。2.區域性變數 只能在函式內使用的變數。3.環境變數 可以在任何shell中使用的變數。在當前shell中任何地方都能使用,不同shell中的全域性變數互不影響,在shell中定義的變數...