2011-03-30 39 views
1
#!/bin/bash 
# This question is from advanced bash scripting guide section 5.1 

echo 
var="'(]\\{}\$\"" 
IFS='\' 
echo $var 

    # output is '(] {}$"  
    # \ converted to space. Why? 

echo "$var"  

    # output is '(]\{}$"  
    # special meaning of \ used, \ escapes \ $ and " RIGHT? 

echo 
var2="\\\\\"" 
echo $var2  

    # output is "   
    # \ converted to space. Why? 

echo 

    # But ... var2="\\\\"" is illegal. Why? 

var3='\\\\' 
echo "$var3"  # \\\\ 

    # Strong quoting works, though. Why? 
+0

請格式化您的問題,以便我們能夠理解它。 – 2011-03-30 22:28:00

+0

對不起,但你不明白什麼?格式不正確? – abc 2011-03-30 22:28:57

+0

您的帖子的哪些部分是您的問題以及哪些部分是腳本尚不清楚。更不用說大部分腳本根本沒有格式化。 – 2011-03-30 22:30:56

回答

3
IFS='\' 
echo $var   

    # o/p is '(] {}$"  

    # \ converted to space. Why? 

因爲你告訴一個反斜槓是一個字段分隔殼,因爲你並沒有引述$var當你回顯出來,它基於IFS是受word splitting

echo "$var"  

    # o/p is '(]\{}$"  
    # special meaning of \ used, \ escapes \ $ and " RIGHT ? 

在這裏,你引述$var,因此沒有word splitting將對其執行。你的輸出正是你告訴shell var等於。即'(]\{}$"

var2="\\\\\"" 

echo $var2  

    # o/p is "   
    # \ converted to space. Why? 

見第一個答案

# But ... var2="\\\\"" is illegal. Why? 

因爲每對反斜槓拼成一個反斜槓並沒有反斜線遺留逃脫了第二雙引用。 shell不知道如何處理3個雙引號。

echo "$var3"  # \\\\ 

    # Strong quoting works, though. Why ? 

見第二回答有關word splitting

,你也可以使用字符串文字語法$''可見var=$'\'(]\{}$"'這將只需要你逃跑了單引號

+0

我還是很困惑。爲什麼在$和$之前沒有轉換爲空間來執行echo $ var? – abc 2011-03-31 00:29:03

+0

@abc:因爲'\'本身不是一個字符,而是表示轉義序列的語法。所以'\ $'和'\「'是告訴shell你想要一個文字'$'和一個文字''',這是必要的,因爲'$'本身對shell有特殊的含義,你必須轉義雙引號,因爲你已經把'var用雙引號括起來的值,它只是'\\',它是一個字面反斜槓,隨後由字段分隔符進行計數 – SiegeX 2011-03-31 04:10:08

+0

Perfect.Thanks @SiegeX! – abc 2011-04-02 18:27:08