版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iamlaosong/article/details/54728393
最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所以需要生成最近几天的日期,以便检测文件是否存在,看下面的脚本中如何使用双引号、单引号、反引号:
OPDATE=`date -d '-1 day' +%Y%m%d`
for i in $(seq 10)
do
FILEDATE=`date -d "-$i day" +%Y%m%d`
echo ${FILEDATE}
done
1、由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如例程中的 '-1 day',再比如:
$ string=’$PATH’
$ echo $string
$PATH
$
可见$保持了其本身的含义,作为普通字符出现。
2、由双引号括起来的字符,除$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于“$”来说,就是用其后指定的变量的值来代替这个变量和$;对于“\”而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上“\”的只有四个字符$,\,’和”本身。而对”号,若其前面没有加“\”,则Shell会将它同前一个”号匹配。如例程中的"-$i day",会随着循环,将$i转换成其代表的值。
3、反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d '-1 day' +%Y%m%d`就是把这条命令的结果赋给变量OPDATE。
4、反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义。例如:
$ abc=`echo The number of users is \`who| wc -l\``
$ echo $abc
The number of users is 2
$
5、在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执行``中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包含的可以是任何一个合法的Shell命令,如:
$ ls
note readme.txt Notice Unix.dir
$ TestString="`echo $HOME ` ` ls [nN]*`"
$ echo $TestString
/home/yxz note Notice
最后,说句题外话: 反引号是一个老的用法,$()才是新的用法,如例程中的$(seq 10)。无论是在学习中,还是在实际工作中,$()都是被推荐的用法。所以上面的的用法可以改成:
$ TestString="$(echo $HOME) $(ls [nN]*)"
$ echo $TestString
/home/yxz note Notice
对于脚本的执行情况,可以用下面的命令来分析:
sh -x test.sh
变量用双引号括起来的意义
如果变量不用双引号括起来,比如echo $a
,那么隐含的意义就是,把$a
变量的字符串,按照空格、制表符、换行符等符号来分割开。然后把这些分割后的每一项再按 glob
模式展开,最后把这些值,再用一个空格重新连接起来,并打印出来。
如果碰巧$a
变量的字符串中,有连续两个空格符号,或者有制表符,那么echo $a
就与程序员的思路出现了不一致。比如下例:
qilei@AFAAW-704030720:~$ cat a.sh
#!/bin/bash
a="1 2 3 4"
echo $a
echo "$a"
qilei@AFAAW-704030720:~$ ./a.sh
1 2 3 4
1 2 3 4
qilei@AFAAW-704030720:~$
推荐今后编程中,变量必须用双引号括起来
bash编程里的变量,全部用双引号括起来。这样更符合程序员的思路。
比如echo "$a"
举一反三,脚本命令的参数变量,也是同理的。
附加echo的简单说明
如下例所示,
echo -n 字符串;其中选项n表示输出文字后不换行。
echo -e 字符串;才能使用转义符号\
。
qilei@AFAAW-704030720:~$ echo "\n"
\n
qilei@AFAAW-704030720:~$ echo -e "\n"
qilei@AFAAW-704030720:~$ echo -ne "\n"
qilei@AFAAW-704030720:~$