簡體   English   中英

(多個)雙引號和變量

[英](multiple) double quote and variable

對bash變量使用多個雙引號似乎與對一個雙引號或不使用雙引號具有相同的結果。

例如, t1=at2="a"t3=""a"" ,將它們回顯會顯示相同的結果: a 有什么區別嗎?

最后, if [ $x == "valid" ]; then之間的區別是什么if [ $x == "valid" ]; then if [ $x == "valid" ]; thenif [ ""$x"" == "valid" ]; then if [ ""$x"" == "valid" ]; thenif [ "$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 abecho a "" b 空雙引號被視為一個參數,因此在a和b之間打印出兩個空格。

echo ""at3=""a""是空雙引號的無用用法。 空字符串作為a的一部分包括在內,因此無效。

進行變量檢查的正確方法是: if [ "$x" = "some text" ]; then ... if [ "$x" = "some text" ]; then ...如果x為空,則將其視為空參數(這是所需的行為。)

如果您跳過引號: if [ $x = "this is bad" ]; then ... if [ $x = "this is bad" ]; then ...如果x為空或包含空格,您將遇到問題。 測試甚至根本看不到x,並且=是第一個參數。

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

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

最終,雙引號的全部要點是操縱命令行如何拆分為參數。 echo "a"echo aecho ""a""都將單個'a'字符作為其第一個參數,因此完全等效。 echo abecho "ab"不相等。 第一個有兩個參數,第二個只有一個參數。 在第一種情況下,雙精度空格將折疊為分隔參數的單個空格。 在第二種情況下,雙精度空格將保留為參數的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM