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# 

相关文章
相关标签/搜索