《LINUX實操:shell中while循環的陷阱》要點:
本文介紹了LINUX實操:shell中while循環的陷阱,希望對您有用。如果有疑問,可以聯系我們。
在寫while循環的時候,發現了一個問題,在while循環內部對變量賦值、定義變量、數組定義等等環境,在循環表面失效.
一個簡單的測試劇本如下:
#!/bin/bash
echo "abc xyz" | while read line
do
new_var=$line
done
echo new_var is null: $new_var?
執行成果證明,$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取代寫法一:
#!/bin/bash
while read line
do
new_var=$line
done <<< "abc xyz"
echo new_var is null: $new_var?
或者使用寫法四的過程替換:
#!/bin/bash
while read line
do
new_var=$line
done < <(echo "abc xyz")
echo new_var is null: $new_var?
由此可以說,在上面的5種寫法中,使用的最廣泛的寫法一雖然最簡單、便利,但其實是最爛的一種.
本文永遠更新鏈接地址:
更多LINUX教程,盡在維易PHP學院專欄。歡迎交流《LINUX實操:shell中while循環的陷阱》!
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8872.html