while循環中的一個常見問題

在樓主剛剛學習接觸while循環的時候,發現了一個問題,在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代替寫法一:

while循環中的一個常見問題 

或者使用寫法四的進程替換:

while循環中的一個常見問題 

由此可以說,在上面的5種寫法中,使用的最廣泛的寫法一雖然最簡單、方便,但個人覺得有點不好。

原創文章,作者:XnlZ,如若轉載,請注明出處:http://www.www58058.com/85447

(3)
XnlZXnlZ
上一篇 2017-08-26
下一篇 2017-08-26

相關推薦

  • M20 – 1- 第二周(1):課堂練習與作業

    課堂練習:  1、字符終端登錄時,顯示當前登錄終端號,主機名和當前時間 [root@centos6 ~]# tty             #顯示當前終端號 /dev/pts/0 [root@cent…

    Linux干貨 2016-08-02
  • 文本編輯sed

    *** sed:Stream EDitor  流編輯器 一次處理一行內容 sed [option]…  'script'  inputfile…常用選項:     -n∶使用安靜(silent)模式。在一般 sed 的用法中, &nbs…

    Linux干貨 2016-08-10
  • 重定向

    Linux下定義了三種I/O設備: 標準輸入(STDIN):用0表示,默認的標準輸入設備是鍵盤; 標準輸出(STDOUT):用1表示,默認的標準輸出設備是當前終端; 標準錯誤(STDERR):用2表示,默認的標準錯誤輸出設備是當前終端; I/O重定向即改變默認的位置 1 標準輸出重定向 (1)將標準輸出重定向到其他終端 /dev/pts/1代表偽終端1,在偽…

    Linux干貨 2017-07-31
  • 考試題目

    1、  簡述TCP三次握手四次揮手過程及各過程中客戶端和服務器端的狀態。 TCP三次握手,四次斷開通過以下圖示說明: 2、說說進程和線程的區別 (1)一個線程只能輸入某一個進程,一個進程可以有多個線程。一個程序至少有一個進程,一個進程至少有一個線程。 (2)進程有獨立的地址空間,線程沒有獨立的地址空間,進程內的多個線程共享進程的地址空間。 (3)線…

    Linux干貨 2016-06-19
  • linux進程管理

    linux系統進程查看及管理工具 對于服務器來說重要的IO 設備磁盤網絡 pstree,ps,pidof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup,nice,renice,killall….. pstree命令: pstree-display …

    Linux干貨 2016-09-09
  • Linux基礎指令(1)

    1.Linux上的文件管理類命令都有哪些,其常用的使用方法及相關實例演示  文件管理工具:cp mv rm cp命令 : 單源復制: cp [option]… [-T]  SOURCE DEST     -bash-4.1# …

    Linux干貨 2016-11-09
欧美性久久久久