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 19:23
下一篇 2017-08-26 19:39

相關推薦

  • Python 數據結構

    python 內置數據結構python 內置數據結構數字的處理函數: round() 五舍六入 ? ? ? 2.5 ?2 ? ? 2.6 ? ?3 floor() 向下取整 ? ? ? 2.5 ?2 ? ? 2.6 ? ?2 ceil() 向上取整 ? ? ? 2.5 ?3 ? ? 2.6 ? ?3 min() 取最小的 ? ? ? 1,2,3 ? ? ?1…

    Linux干貨 2017-09-23
  • linux目錄基礎、簡單的命令以及運用linux幫助

    計算機組成及其功能     計算機其實是:接收用戶輸入指令與數據,經過中央處理器的數據與邏輯單元運算處理后,以產生或存儲成有用的信息。所以計算機組成可以分為輸入單元、輸出單元、CPU(控制單元、算術邏輯單元)、內存     輸入單元:包括鍵盤、鼠標、掃描儀、手寫板、觸摸屏等;實現…

    Linux干貨 2016-09-17
  • linux命令的使用格式

    Linux命令的一般格式為: [root@node1 ~]#command [選項] [參數] 1、ifconfig 設備 參數 參數: up:啟動指定設備 down:關閉指定設備 arp:指定設備是否支持ARP協議 -a:顯示全部接口信息 例如:[root@node1 ~]#ifconfig eth0 up #啟動eth0網卡 2、echo打印 &nbsp…

    Linux干貨 2016-09-17
  • 千萬不要把 bool 設計成函數參數

    我們有很多Coding Style 或 代碼規范。但這一條可能會經常被我們所遺忘,就是我們經常會在函數的參數里使用bool參數,這會大大地降低代碼的可讀性。不信?我們先來看看下面的代碼。 當你讀到下面的代碼,你會覺得這個代碼是什么意思? widget->repaint(false); 是不要repaint嗎?還是別的什么意思?看了文檔后,我們才知道這個…

    Linux干貨 2016-07-10
  • Linux 入門基礎 及一些常見命令(上)

    計算機的組成及其各部分的功能 現代計算機的基本結構是由匈牙利-美國科學家馮· 諾依曼于1946年提出的。迄今為止所有進入實用的電子計算機  都是按馮· 諾依曼提出的結構體系和工作原理設計制造的,故又統稱為“馮·諾依曼型計算機". 根據馮.諾依曼原理:計算機由運算器、控制器、存儲器、輸入設備、輸出設備所組成. 運算器: 進行算術與邏輯運算.…

    Linux干貨 2016-09-17
  • 初識linux

    Linux 是什么?2014年之前我都沒有聽說過linux。 簡單來說,Linux是一種操作系統,我們知道Windows吧,Linux也是一種操作系統。 特性: (1)字符界面(當然現在也有圖形界面了) (2)一切皆文件 (3)許多小工具程序組合 Linux脫胎于Unix,Unix是由貝爾實驗開發的。符合posix 標準,Unix系統上面的應用程序大部分可以…

    Linux干貨 2016-06-01
欧美性久久久久