Bash, 雙引號,單引號,感嘆號

當要引用一個變量的值時,通常推薦使用雙引號。使用雙引號除了變量名[2]前綴($)、後引符(`)和轉義符(\)外,會使shell再也不解釋引號中其它全部的特殊字符。[3] 用雙引號時$仍被當成特殊字符,容許引用一個被雙引號引發的變量("$variable"), 那也是說$variable會被它的值所代替。web

用雙引號還能使句子不被分割開. [4] 一個參數用雙引號引發來能使它被看作一個單元,這樣即便參數裏面包含有空白字符也不會被shell分割開了。shell


單引號(' ')和雙引號相似,但它不容許解釋變量引用,所以,在單引號內的字符$的特殊意思無效了。在單引號內,除了字符',每一個特殊字符都只是字面的意思。單引號(全局引用)比雙引號(部分引用)更嚴格的處理引用部分。bash

感嘆號(!)稱之爲事件指示器 (event designator) ,用以對.bash_history中的某個命令行條目的引用。 spa

!!     引用上一條命令。這是 `!-1' 的同義詞。
!string
引用最近的以 string 開始的命令。
!?string[?]
命令行

引用最近的包含 string 的命令。尾部的 ? 能夠被忽略,若是 string 以後緊接着一個新行符。事件


在命令行上,把感嘆號"!"放在雙引號裏執行命令會出錯(譯者注:好比說:echo "hello!"). 由於感嘆號被解釋成了一個歷史命令. 然而在一個腳本文件裏,這麼寫則是正確的,由於在腳本文件裏Bash的歷史機制被禁用了 ip


root@test-desktop:/home/James/mypro/Linux-Pro/Network# !!string

lsit

hostname_to_ip  hostname_to_ip.c  hostname_to_ip.c~  ip_to_hostname  ip_to_hostname.c  ip_to_hostname.c~  Makefile  Makefile~event

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "$CLASSPATH"

.:/lib:/opt/jdk1.5.0_22/jre/lib:

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo '$CLASSPATH'

$CLASSPATH

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "$(ls)"

hostname_to_ip

hostname_to_ip.c

hostname_to_ip.c~

ip_to_hostname

ip_to_hostname.c

ip_to_hostname.c~

Makefile

Makefile~

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo '$(ls)'

$(ls)

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "!"

-bash: !: event not found

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo '!'

!

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo !

!

root@test-desktop:/home/James/mypro/Linux-Pro/Network# ls

hostname_to_ip  hostname_to_ip.c  hostname_to_ip.c~  ip_to_hostname  ip_to_hostname.c  ip_to_hostname.c~  Makefile  Makefile~

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "!"

-bash: !: event not found

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "!!"

echo "ls"

ls

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "$(!!)"

echo "$(echo "ls")"

ls

root@test-desktop:/home/James/mypro/Linux-Pro/Network# ls

hostname_to_ip  hostname_to_ip.c  hostname_to_ip.c~  ip_to_hostname  ip_to_hostname.c  ip_to_hostname.c~  Makefile  Makefile~

root@test-desktop:/home/James/mypro/Linux-Pro/Network# echo "$(!!)"

echo "$(ls)"

hostname_to_ip

hostname_to_ip.c

hostname_to_ip.c~

ip_to_hostname

ip_to_hostname.c

ip_to_hostname.c~

Makefile

Makefile~

root@test-desktop:/home/James/mypro/Linux-Pro/Network# 

相關文章
相關標籤/搜索