2014-02-28 49 views
0

將多個雙引號放到bash變量中似乎具有相同的結果來放置一個或不帶雙引號。(多個)雙引號和變量

例如,t1=a,t2="a"t3=""a"",回顯它們打印相同的結果:a。有什麼區別嗎?

最後,if [ $x == "valid" ]; then,if [ ""$x"" == "valid" ]; thenif [ "$x" == "valid" ]; then有什麼區別?

回答

2

連續的引號是簡單的多餘的

這並不意味着一個不帶引號的變量的行爲類似於引用的行爲。

下面的例子應該澄清:

$ set -x      # enable xtrace 
$ foo="" 
+ foo= 
$ [ -n $foo ] && echo y  # unquoted variable results in incorrect result for "string not empty" check 
+ '[' -n ']' 
+ echo y 
y 
$ [ -n "$foo" ] && echo y  # quoted variable results in correct result for the same check 
+ '[' -n '' ']' 
$ [ -n ""$foo"" ] && echo y 
+ '[' -n '' ']' 
$ echo "hey" 
+ echo hey 
hey 
$ echo ""hey""     # produces same result as in the previous case 
+ echo hey 
hey 
$ echo """hey""" 
+ echo hey 
hey 
+0

你可以解釋或提供爲什麼'未加引號的變量導致「字符串不空」檢查結果不正確的原因,我是一個初學者,這是不清楚的。 –

+0

@HelinWang這正是我爲什麼要追蹤的原因。以「+」開頭的行顯示shell如何解釋命令。請看看,並讓我知道如果你有任何疑問。 – devnull

+1

「連續引號簡直是多餘的」似乎意味着任意數量的連續引號與單個字符相同。實際上,每一對連續的引號只是定義了一個空字符串。考慮一下像「echo」「」hey there「」「vs'echo」「hey there」「''。 – chepner

1

bash中的報價就像一個開關。當bash看到一個報價時,它會打開報價。當它看到另一個報價時,它將其關閉。

因此echo ""a""是相同echo a

如果x爲空或取消,那麼你將不得不提供各地的可變引號,否則bash將給出一個錯誤。

在處理文件時,引用非常重要。 $只是一個替換命令,如果你的文件名有一個空格,那麼$只是擴展文件名。如果你周圍沒有引號,bash會把它看成兩個單詞而不是一個單詞。

查看本教程。 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html

+0

報價打開和關閉之間有什麼區別?我得到'echo'a'(ON)與'echo a'(OFF)相同。 –

+0

@HelinWang看我的編輯。 –

+0

感謝您的回覆,現在我明白了。爲了簡單和清晰,我選擇了devnull的答案。 –

0

雙引號中是一個空的雙引號。它不是嚴格意義上的,因爲它可以作爲一個參數,例如:echo a becho a "" b不同。空雙引號被視爲一個參數,所以兩個空格之間打印出一個b。

echo ""at3=""a""是無用的空雙引號。空字符串作爲a的一部分包含在內,因此它不起作用。

正確的方式做一個變量檢查​​是這樣的:if [ "$x" = "some text" ]; then ... 如果x是空的,如果你跳過報價將被視爲空的參數

if [ $x = "this is bad" ]; then ...你(這是所需的行爲。)如果x爲空或者包含空格,將會出現問題。測試甚至不會看到x,而=會是第一個參數。

如果x爲空,在x:if [ ""$x"" = "this is bad" ]; then ...周圍使用雙引號實際上仍然可以正常工作。但是,如果x包含空格,會有問題。例如x="a b"。測試會將a和b看作單獨的參數,這是沒有意義的。

如果要在參數中包含文字雙引號字符,請使用反斜槓:echo "\""echo \"

最終,雙引號的全部內容是操縱命令行如何拆分爲參數。echo "a"echo aecho ""a""都有一個'a'字符作爲它們的第一個參數,因此完全相同。 echo a becho "a b"不等價。第一個有兩個參數,第二個只有一個。在第一種情況下,雙空間將摺疊爲分隔參數的單個空間。在第二種情況下,雙重空間將作爲參數的一部分被保留。