Bash?Shell中單引號和雙引號的區(qū)別小結(jié)
在Bash Shell中,單引號('
)和雙引號("
)都用于定義字符串,但它們之間有一些重要的區(qū)別。這些區(qū)別影響字符串的解釋方式,變量的擴展,以及特殊字符的處理。
單引號
字面值:在單引號中的所有字符都會被視為字面值,即它們的特殊含義不會被解釋。例如,$
用于變量擴展,但在單引號中它只會被視為普通的美元符號。
echo '$HOME'
上面的命令將輸出$HOME
,而不是展開為環(huán)境變量HOME
的值。
不允許嵌套單引號:單引號內(nèi)不能包含其他單引號,即使它們被轉(zhuǎn)義。要在單引號字符串中包含單引號,你需要使用一種特殊的語法:
echo 'It'\''s a test'
這將輸出It's a test
。
單引號 ('
) 用于保留字符的字面含義,特殊字符在單引號里面,都會變?yōu)槠胀ㄗ址?,例?nbsp;*
、$
、反斜杠 (\
) 等。
(base) yongqiang@yongqiang:~/bash_work$ ls -l total 0 -rwxr-xr-x 1 yongqiang yongqiang 231 May 13 23:24 bash_script.sh -rw-r--r-- 1 yongqiang yongqiang 0 May 15 09:31 yongqiang.txt (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo * bash_script.sh yongqiang.txt (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '*' * (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "*" * (base) yongqiang@yongqiang:~/bash_work$
(base) yongqiang@yongqiang:~/bash_work$ echo $ $ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$' $ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$" $ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $PATH /home/yongqiang/bin:/home/yongqiang/miniconda3/bin:/home/yongqiang/miniconda3/condabin:......:/home/yongqiang/software/platform-tools/ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$PATH' $PATH (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $PATH /home/yongqiang/bin:/home/yongqiang/miniconda3/bin:/home/yongqiang/miniconda3/condabin:......:/home/yongqiang/software/platform-tools/ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $USER yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$USER' $USER (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$USER" yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $((5 + 1)) 6 (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$((5 + 1))' $((5 + 1)) (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$((5 + 1))" 6 (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $(echo $USER) yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$(echo $USER)' $(echo $USER) (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$(echo $USER)" yongqiang (base) yongqiang@yongqiang:~/bash_work$
反斜杠在單引號中變成了普通字符。如果在單引號之中,還要使用單引號,不能使用轉(zhuǎn)義,需要在外層的單引號前面加上一個($
),然后再對里層的單引號轉(zhuǎn)義。
(base) yongqiang@yongqiang:~/bash_work$ echo '\' \ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo 'It's me!' bash: !': event not found (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo 'It\'s me!' bash: !': event not found (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $'It\'s me!' It's me! (base) yongqiang@yongqiang:~/bash_work$
在雙引號之中使用單引號。
(base) yongqiang@yongqiang:~/bash_work$ echo "It's me!" It's me! (base) yongqiang@yongqiang:~/bash_work$
雙引號
變量擴展:雙引號中的變量會被擴展,即$var
會被替換為變量var
的值。
name="John" echo "Hello, $name"
上面的命令將輸出Hello, John
。
特殊字符解釋:雙引號中的特殊字符,如\n
(換行)和\t
(制表符),會被解釋。
echo "Line 1\nLine 2"
這將輸出兩行文本,而不是一行。
感嘆號問題:雙引號中的感嘆號!
可能會引起歷史擴展問題,這需要特別注意。
雙引號 ("
) 比單引號 ('
) 寬松。在雙引號中,反引號 (`
)、$
、反斜杠 (\
) 三個特殊字符會被 Bash 自動擴展。$
符號用于引用變量,反引號 (`
) 用于執(zhí)行子命令。反斜杠 (\
) 在雙引號之中用來轉(zhuǎn)義。
(base) yongqiang@yongqiang:~/bash_work$ echo ? ? (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '?' ? (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "?" ? (base) yongqiang@yongqiang:~/bash_work$
(base) yongqiang@yongqiang:~/bash_work$ echo $SHELL /bin/bash (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$SHELL' $SHELL (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$SHELL" /bin/bash (base) yongqiang@yongqiang:~/bash_work$
使用反斜杠,在雙引號之中插入雙引號,或者插入反斜杠本身。
(base) yongqiang@yongqiang:~/bash_work$ echo '\\' \\ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "\\" \ (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo ""yongqiang"" yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "\"yongqiang\"" "yongqiang" (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "It's me!" It's me! (base) yongqiang@yongqiang:~/bash_work$
Bash 正常情況下會將換行符解釋為命令結(jié)束,但是換行符在雙引號之中就失去了這種特殊作用,只用來換行??梢暂斎攵嘈?,echo
命令會將換行符原樣輸出,顯示的時候正常解釋為換行。
(base) yongqiang@yongqiang:~/bash_work$ echo "yong > qiang" yong qiang (base) yongqiang@yongqiang:~/bash_work$
如果文件名中包含空格,需要使用雙引號或單引號,將文件名放在里面。
(base) yongqiang@yongqiang:~/bash_work$ ls -l total 0 -rwxr-xr-x 1 yongqiang yongqiang 106 May 13 20:11 bash_script.sh (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ touch "yong qiang.txt" (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ ls -l total 0 -rwxr-xr-x 1 yongqiang yongqiang 106 May 13 20:11 bash_script.sh -rw-r--r-- 1 yongqiang yongqiang 0 May 13 21:27 'yong qiang.txt' (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ ls -l "yong qiang.txt" -rw-r--r-- 1 yongqiang yongqiang 0 May 13 21:27 'yong qiang.txt' (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ ls -l 'yong qiang.txt' -rw-r--r-- 1 yongqiang yongqiang 0 May 13 21:27 'yong qiang.txt' (base) yongqiang@yongqiang:~/bash_work$
單引號 (') - 雙引號 (")
對于普通字符串或文本,單引號和雙引號的作用相同。
(base) yongqiang@yongqiang:~/bash_work$ echo "yongqiang" yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo 'yongqiang' yongqiang (base) yongqiang@yongqiang:~/bash_work$
當打印已定義的變量時,需要使用雙引號,使用單引號將被視為普通字符。
(base) yongqiang@yongqiang:~/bash_work$ NAME="yongqiang" (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $NAME yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$NAME' $NAME (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$NAME" yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ NAME='yongqiang' (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo $NAME yongqiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo '$NAME' $NAME (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo "$NAME" yongqiang (base) yongqiang@yongqiang:~/bash_work$
單引號 ( '
) 和雙引號 ( "
) 可以保存多個連續(xù)的空格。
(base) yongqiang@yongqiang:~/bash_work$ echo "yong qiang" yong qiang (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ echo 'yong qiang' yong qiang (base) yongqiang@yongqiang:~/bash_work$
(base) yongqiang@yongqiang:~/bash_work$ cat ./bash_script.sh #!/bin/bash echo "start" echo echo "Hello, world!" NAME="yongqiang!" echo $NAME echo echo "111!" COMMENT="Hello, $NAME" echo $COMMENT echo echo "222!" COMMENT='Hello, $NAME' echo $COMMENT echo "Hello, world!" echo echo "end" (base) yongqiang@yongqiang:~/bash_work$ (base) yongqiang@yongqiang:~/bash_work$ ./bash_script.sh start Hello, world! yongqiang! 111! Hello, yongqiang! 222! Hello, $NAME Hello, world! end (base) yongqiang@yongqiang:~/bash_work$
到此這篇關(guān)于Bash Shell中單引號和雙引號的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Shell單引號和雙引號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
慎用rm -rf /與 rm -rf /* 推薦使用mv代替rm
本文主要介紹了慎用rm -rf /與 rm -rf /* 推薦使用mv代替rm,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10Linux?shell中$(())、$()、``與${}的區(qū)別
本文主要介紹了Linux?shell中$(())、$()、``與${}的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06如何使用Shell腳本掩蓋Linux服務(wù)器上的操作痕跡(推薦)
這篇文章主要介紹了使用Shell腳本掩蓋Linux服務(wù)器上的操作痕跡,需要的朋友可以參考下2017-12-12