在樓主剛剛學習接觸while循環的時候,發現了一個問題,在while循環內部對變量賦值、定義變量、數組定義等等環境,在循環外面失效。
一個簡單的測試腳本如下:
執行結果證明,$new_var的結果是空值。在google上查了查,才發現問題出在管道上。
先看看下面的內容。
while循環的寫法有好幾種,它的語法結構為:
while test_cmd_list; do cmd_list; done
但更經常地,while循環更多地用于讀取標準輸入的內容來實現循環。有以下幾種寫法:
寫法一:使用管道傳遞內容,這是用的最多、但卻最爛的寫法
echo “abc xyz” | while read line
do
…
done
寫法二:
while read line
do
…
done <<< “abc xyz”
寫法三:從文件中讀取內容
while read line
do
…
done </path/filename
方法四:采用進程替換
while read var
do
…
done < <(cmd_list)
方法五:改變標準輸入
exec <filename
while read var
do
…
done
盡管寫法有多種,但它們并不等價。方法一中使用的是管道符號,這使得while語句在子shell中執行,這意味著while語句內部設置的變量、數組、函數等在循環外部都不再生效。這正是文章開頭所說的陷阱。更簡單的:echo haha | a=5,在命令執行結束后,變量a的值也不再是5。其余4種寫法,while語句都不在子shell中執行,因此都不會出現文章開頭所說的問題。
例如,使用寫法二的here string代替寫法一:
或者使用寫法四的進程替換:
由此可以說,在上面的5種寫法中,使用的最廣泛的寫法一雖然最簡單、方便,但個人覺得有點不好。
原創文章,作者:XnlZ,如若轉載,請注明出處:http://www.www58058.com/85447