字符串与引号
Shell 的模型就是标准的字符流过滤器模型,简单来说,就是一条命令把结果送到标准输出,这个标准输出被连接到下一个命令的标准输入,由此来实现一系列命令之间的联动。 每一个命令的输出都是自己过滤后的字符流,接受的输入都是一个需要过滤处理的字符流。 故字符串是 Shell 中很重要的数据。 字符串通常需要使用引号,尤其是其包含若不转义就会引起歧义的字符时。 Shell 下有 3 种引号,分别是单引号 ('')、双引号 ("")和反引号 (``)。其中除反引号(``)用于命令外,前两种都用于字符串。
单引号('')
单引号中的字符串 Shell 不会做任何处理,在需要保持字符串原样不变的时候使用,在其中使用变量是无效的。
[root@ansible test]# var1='1232'
[root@ansible test]# echo $var1
1232
[root@ansible test]# echo '$var1'
$var1
双引号("")
双引号中的字符串 Shell 会进行处理,若其中含有可以求值的部分,会被 Shell 替换为求值的结果,其中包含变量、表达式或命令。
- 如果包含了变量,那么该变量会被解析得到值
- 如果出现双引号的子字符串,但是需要转义;
[root@ansible test]# echo $var1\" is odd\"
1232" is odd"
反引号(``)
反引号比较特殊,它一般用来引用一条命令,并且将这个命令的输出结果(输出到标准输出上)作为这个字符串最终的值,作用与符号“$()”相同。
在反引号中或者在$()符号中的命令的输出会被当作字符串的实际内容。如果反引号引用的命令出现在双引号字符串中,这部分也会被替换为命令的输出。
[root@ansible test]# echo time is `date`
time is 2025年 07月 28日 星期一 04:40:31 EDT
[root@ansible test]# echo time is $(date)
time is 2025年 07月 28日 星期一 04:40:43 EDT
[root@ansible test]# echo "time is `date`"
time is 2025年 07月 28日 星期一 04:41:11 EDT
[root@ansible test]# echo "time is $(date)"
time is 2025年 07月 28日 星期一 04:41:29 EDT
不被引号包围的字符串
出现变量时也会被解析(同双引号 " ");
字符串中如果出现空格,空格后边的字符串会作为其他变量或者命令解析。
[root@ansible test]# var2=123 253
bash: 253: 未找到命令...
[root@ansible test]# var2="123 253"
[root@ansible test]# echo $var2
123 253
















