说一下单引号、双引号和不加引号区别
总结说明:
单引号:
可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。
双引号:
特殊符号,有了原本的特殊意思,$LANG $() ``
把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。
双引号内命令或变量的写法为 `命令或变量`或$(命令或变量)。
无引号:
与双引号类似,支持通配符。
把内容输出出来,可能不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号替代之。
范例:
##单引号
1 2 | [root@oldboy32-vm1 ~] # echo '$LANG $PATH $(whichawk) {a..d}' $LANG $PATH $( which awk ) {a..d} |
##双引号
1 2 | [root@oldboy32-vm1 ~] # echo "$LANG $PATH$(which awk) {a..d}" en_US.UTF-8 /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin /bin/awk {a..d} |
##不加引号
1 2 3 4 5 6 | [root@oldboy32-vm1 ~] # echo $LANG $PATH $(whichawk) {a..d} en_US.UTF-8 /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin /bin/awka b c d [root@oldboy32-vm1 ~] # ls *.txt a.txt cn.txt oldboy_jia.txt oldboy.txt oldgirl.txt zh.txt [root@oldboy32-vm1 ~] # ls "*.txt" ls : cannot access *.txt: No such file or directory |
工作中多用双引号,除非你有明确的特殊的需求。
实践演示
实例1:经过反引号的`date`命令,命令行测试
1 2 3 4 5 6 | [root@Oldboyedu ~]$ echo '`date`' #### 单引号时看到啥就显示啥。 ` date ` [root@Oldboyedu ~]$ echo "`date`" #### 双引号,如果里面是变量,会先把变量解析成具体内容再显示 Sun Mar 22 09:43:13 CST 2015 [root@Oldboyedu ~]$ echo ` date ` #### 对于连续的字符串等内容一般不加引号也可,加双引号比较保险,推荐。 Sun Mar 22 09:43:19 CST 2015 |
实例2:脚本中变量定义后,调试时测试
1 2 3 4 5 6 7 | [root@Oldboyedu ~]$ wxr=testchars ###创建一个不带引号的变量 [root@Oldboyedu ~]$ echo $wxr ###不加引号,显示一个变量解析后的内容 testchars [root@Oldboyedu ~]$ echo '$wxr' ###单引号,显示一个变量本身 $root [root@Oldboyedu ~]$ echo "$wxr" ###双引号,一个变量内容,引号内可以是变量、字符串等 testchars |
实例3:脚本重定义变量测试
1 2 3 4 5 6 7 | [root@Oldboyedu ~]$ echo $wxr [root@Oldboyedu ~]$ wxr=this is testchars ###不加引号无法定义。shell会把 is解释成命令。 - bash : is: command not found [root@Oldboyedu ~]$ wxr= "this is testchars" [root@Oldboyedu ~]$ echo $wxr this is testchars |
结论:一般应用时,对于变量的定义,我们一般加双引号。
实例4:grep过滤字符串例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@Oldboyedu ~]$ cat > grep .log<<EOF > testchars > wxr > wxrlyy > EOF [root@Oldboyedu ~]$ cat grep .log testchars wxr wxrlyy [root@Oldboyedu ~]$ wxr=testchars [root@Oldboyedu ~]$ echo $wxr testchars [root@Oldboyedu ~]$ grep "$wxr" grep .log testchars [root@Oldboyedu ~]$ grep '$wxr' grep .log [root@Oldboyedu ~]$ grep $wxr grep .log testchars |
实例5:grep过滤双引号(转义)例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@Oldboyedu ~]$ cat >wxr.log<<EOF > "test" > test > EOF [root@Oldboyedu ~]$ cat wxr.log "test" test [root@Oldboyedu ~]$ grep " wxr.log ####直接按ctrl+d或ctrl+c 取消执行命令 > - bash : unexpected EOF while looking for matching `"' - bash : syntax error: unexpected end of file [root@Oldboyedu ~]$ grep " wxr.log > ^C #### è停在这里等待输入 [root@Oldboyedu ~]$ grep \" wxr.log "test" |
实例6:特殊例子:命令行带空格字符串可以不加引号。可以不加引号的例子。
1 2 3 4 5 6 7 | [root@Oldboyedu ~]$ echo I am wxr >>wxr.txt [root@Oldboyedu ~]$ cat wxr.txt I am wxr [root@Oldboyedu ~]$ echo "I am wxr.test" >>wxr.txt [root@Oldboyedu ~]$ cat wxr.txt I am wxr I am wxr. test |
结论:虽然不加引号可以追加内容到oldboy.txt中,生产环境中,我们习惯用""双引号替代。
实例7:特殊例子:awk调用shell变量涉及引号例子
1 2 3 4 5 | [root@Oldboyedu ~]$ ett=123 [root@Oldboyedu ~]$ awk 'BEGIN {print ' $ett '}' 123 [root@Oldboyedu ~]$ awk 'BEGIN {print "$ett"}' $ett |
###提示:以上结果正好和前面的结论相反,这是awk调用shell变量的特殊用法。
1 2 3 4 5 6 7 8 9 | [root@Oldboyedu ~]$ ett= 'abc' [root@Oldboyedu ~]$ echo $ett abc [root@Oldboyedu ~]$ awk 'BEGIN {print "$ett"}' $ett [root@Oldboyedu ~]$ awk 'BEGIN {print ' $ett '}' [root@Oldboyedu ~]$ awk 'BEGIN {print "' $ett '"}' abc |
##提示:这个例子特殊了一点。有关awk调用shell变量参考:
一道实用linux运维问题大的9钟shell解答方法。
总结论
很多时候,总结的结论未必适合所有情况。但是,总结小结论,便于我们学习知识和对知识的深刻理解,因此推荐大家多做总结。
不要太纠结于结论,结论毕竟不是真理,知识我们学习过程的产物。就像数学里的平行线一样,在初中定义就是不相交的两条直线就是平行线,到了高中这个结论就是错的了。