在Shell脚本中,当我们vim test.sh输入以下文本:
echo date
echo `date`
echo $(date)
执行./ test.sh,显示:
date
2017年 06月 26日 星期一 15:56:04 CST
2017年 06月 26日 星期一 15:56:04 CST
在这个例子中,我们可以看出,第一个是直接打印date字符串,而二三则是先执行date命令,然后将执行的结果打印出来。
因此,总结一下,倒引号和$()都是先执行命令然后将执行的结果替换到当前命令行。 然而这两者有什么区别吗?
区别是:当倒引号或者$() 和转义字符一起使用会有不同
我们还是看一个例子:
echo `echo \$PWD`
echo $(echo \$PWD)
当执行./ test.sh 结果显示为:
/home/xuyang/bit_class/script_shell
$PWD
为什么会这样?我们根据结果来分析,第一个打印PWD里面的内容,说明 \ 并没有什么卵用,而第二个只输出了PWD,说明转义字符起作用了,因此我们可以推测:
**倒引号已经对 \ 已经转义了,因此想要实现转义需要再加个 \
而$()则没影响,\照常使用**
我们验证下推测:
echo `echo \\$PWD`
echo $(echo \\$PWD)
当执行./ test.sh 结果显示为:
$PWD
\/home/xuyang/bit_class/script_shell
结果验证了我们的猜想:
对于倒引号,\\表示转义,对$进行转义,这样子就打印出$PWD四个字母,说白了在倒引号中想要转义,必须成对使用\
对于$(),\\则表示对第二\转义,因此会先打印出\,然后再打印出当前目录
和上面两者类似的还有一个命令,eval,那么eval是什么?又该如何使用?与上面有什么区别?
eval [arguments]主要用来两次扫描参数
比如
redirect=">"
ls $redirect file
eval ls $redirect file
当使用eval时候,第一次扫描将$redirect替换为>,第二次执行ls > file,因此完成重定向功能。
eval可以取得最后的参数:eval echo \$$#
用eval命令创建指向变量的“指针”,有点类似第一点
#!/bin/bash
x=10
ptr=x
eval echo \$$ptr
eval $ptr=20
eval echo \$$ptr
结果是:
10
20
关于eval参考了这篇博客