將多個雙引號放到bash變量中似乎具有相同的結果來放置一個或不帶雙引號。(多個)雙引號和變量
例如,t1=a
,t2="a"
,t3=""a""
,回顯它們打印相同的結果:a
。有什麼區別嗎?
最後,if [ $x == "valid" ]; then
,if [ ""$x"" == "valid" ]; then
和if [ "$x" == "valid" ]; then
有什麼區別?
將多個雙引號放到bash變量中似乎具有相同的結果來放置一個或不帶雙引號。(多個)雙引號和變量
例如,t1=a
,t2="a"
,t3=""a""
,回顯它們打印相同的結果:a
。有什麼區別嗎?
最後,if [ $x == "valid" ]; then
,if [ ""$x"" == "valid" ]; then
和if [ "$x" == "valid" ]; then
有什麼區別?
連續的引號是簡單的多餘的。
這並不意味着一個不帶引號的變量的行爲類似於引用的行爲。
下面的例子應該澄清:
$ 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
bash中的報價就像一個開關。當bash看到一個報價時,它會打開報價。當它看到另一個報價時,它將其關閉。
因此echo ""a""
是相同echo a
如果x爲空或取消,那麼你將不得不提供各地的可變引號,否則bash將給出一個錯誤。
在處理文件時,引用非常重要。 $只是一個替換命令,如果你的文件名有一個空格,那麼$只是擴展文件名。如果你周圍沒有引號,bash會把它看成兩個單詞而不是一個單詞。
查看本教程。 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_03.html
報價打開和關閉之間有什麼區別?我得到'echo'a'(ON)與'echo a'(OFF)相同。 –
@HelinWang看我的編輯。 –
感謝您的回覆,現在我明白了。爲了簡單和清晰,我選擇了devnull的答案。 –
雙引號中是一個空的雙引號。它不是嚴格意義上的,因爲它可以作爲一個參數,例如:echo a b
與echo a "" b
不同。空雙引號被視爲一個參數,所以兩個空格之間打印出一個b。
echo ""a
和t3=""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 a
和echo ""a""
都有一個'a'字符作爲它們的第一個參數,因此完全相同。 echo a b
和echo "a b"
不等價。第一個有兩個參數,第二個只有一個。在第一種情況下,雙空間將摺疊爲分隔參數的單個空間。在第二種情況下,雙重空間將作爲參數的一部分被保留。
你可以解釋或提供爲什麼'未加引號的變量導致「字符串不空」檢查結果不正確的原因,我是一個初學者,這是不清楚的。 –
@HelinWang這正是我爲什麼要追蹤的原因。以「+」開頭的行顯示shell如何解釋命令。請看看,並讓我知道如果你有任何疑問。 – devnull
「連續引號簡直是多餘的」似乎意味着任意數量的連續引號與單個字符相同。實際上,每一對連續的引號只是定義了一個空字符串。考慮一下像「echo」「」hey there「」「vs'echo」「hey there」「''。 – chepner