linux shell中单引号、双引号及不加引号的简单区别

1. 简单区别

(1) 单引号:

将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。

(2) 双引号:

把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。

(3) 不加引号:

不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后再输出最终内容来。

如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。

[root@n1 ~]# name=quxl
[root@n1 ~]# echo $name    	#不加引号,变量解析出结果,然后再输出
quxl
[root@n1 ~]# echo '$name'  	#单引号,原样输出
$name
[root@n1 ~]# echo "$name"		#双引号,变量解析出结果,然后再输出
quxl

#区分一下双引号与不加引号的区别
[root@n1 ~]# echo "hello $name"
hello quxl
[root@n1 ~]# echo hello $name
hello quxl							#双引号,不加引号看起来没区别啊?
[root@n1 ~]# echo hello         $name
hello quxl							#不加引号,只有一个空格
[root@n1 ~]# echo "hello         $name"
hello         quxl						#双引号,照原格式输出空格


[root@n1 ~]# echo ' today is `date`'  #原样输出
today is `date`
[root@n1 ~]# echo "today is `date`"		#执行命令后再输出
today is Tue Oct 24 11:42:20 CST 2023

2. 注意事项

(1) 当要引用一个变量的值时,一般推荐使用双引号。

(2) 使用双引号除了变量名前缀($)、后引符(`)和转义符()外,会使shell不再解释引号中其它所有的特殊字符。

(3) 用双引号时$仍被当成特殊字符,允许引用一个被双引号引起的变量("$variable"), 那也是说$variable会被它的值所代替。

(4) 用双引号还能使句子不被分割开.

(5) 一个参数用双引号引起来能使它被看作一个单元,这样即使参数里面包含有空白字符也不会被shell分割开了。

3. 关于双引号里的感叹号

在命令行上,把感叹号"!"放在双引号里执行命令会出错(译者注:比如说:echo "hello!"). 因为感叹号被解释成了一个历史命令. 然而在一个脚本文件里,这么写则是正确的,因为在脚本文件里Bash的历史机制被禁用了。

在双号号里在字符""也会引起许多不一致的行为。

[root@n1 ~]# echo hello\!
hello!
[root@n1 ~]# echo "hello\!"
hello\!
[root@n1 ~]# echo !
!
[root@n1 ~]# echo "!"
-bash: !: event not found