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?
4

1 に答える 1

3
IFS='\'
echo $var        

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

    # \ converted to space. Why?

バックスラッシュはフィールド区切り文字であるとシェルに伝え、$varエコーアウトしたときに引用符を付けなかったため、 IFSに基づく単語分割の対象になりました。

echo "$var"      

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

ここで引用$varしたので、単語の分割は実行されません。出力は、シェルvarが等しいと言ったものとまったく同じです。すなわち'(]\{}$"

var2="\\\\\""

echo $var2       

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

最初の答えを見る

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

バックスラッシュのすべてのペアが文字通りのバックスラッシュを構成し、2番目の二重引用符をエスケープするためのバックスラッシュが残っていないためです。シェルは、3つの二重引用符をどうするかを知りません。

echo "$var3"     # \\\\

    # Strong quoting works, though. Why ?

単語分割についての2番目の回答を参照してください

一重引用符をエスケープするだけでよい文字列リテラル構文$''visを使用することもできることに注意してくださいvar=$'\'(]\{}$"'

于 2011-03-30T22:48:12.957 に答える