2016-08-23 50 views
0

我測試下面的bash文件test.sh.但如何解釋輸出。有時我會記得引用字符串變量意味着保留單個變量中的空格,但是如何理解它而不是記住它。如何深入理解引用變量

list="one two three" 
for a in $list 
do 
    echo "$a" 
done 

for a in "$list" 
do 
    echo "$a" 
done 

輸出
一個
一二三

+2

雙引述防止**字分裂**。默認的**內部字段分隔符(IFS)**是'$'\ t \ n''('space','tab','newline')控制shell如何分割未加引號的字符串。 (這被稱爲**分詞**)。意思是一個沒有引號的字符串在shell中被'IFS'中的任何一個字符分割。雙引號可防止***分詞***。 –

回答

1

字分裂的評論和解釋以及內部字段分隔符繼續,這裏是一個簡短的例子,應該有所幫助:

#!/bin/bash 

list="one two three" 

printf "\nDefault IFS (space, tab, newline):\n\n" 
for a in $list 
do 
    echo "$a" 
done 

for a in "$list" 
do 
    echo "$a" 
done 

printf "\nIFS breaking only on newline:\n\n" 
IFS=$'\n' 
for a in $list 
do 
    echo "$a" 
done 

for a in "$list" 
do 
    echo "$a" 
done 

(如果你在腳本繼續設置IFS爲新值後不退出,需要恢復當前(或默認)IFS,無論是保存當前(例如curifs="$IFS"並在完成您的塊後恢復,IFS="$curifs")或者只是重置爲默認值(例如IFS=$' \t\n')。您也可以使用新的IFS子外殼(例如,例如(IFS=$',\n'; #do stuff),或者在while塊中,例如, while IFS=$'\n' read -r line; do ...

實施例使用/輸出

$ bash ifs.sh 
Default IFS (space, tab, newline): 

one 
two 
three 
one two three 

IFS breaking only on newline: 

one two three 
one two three