shell脚本中倒引号,$(), eval的区别

来源:互联网 发布:陕西省网络作家协会 编辑:程序博客网 时间:2024/06/07 13:59

在Shell脚本中,当我们vim test.sh输入以下文本:

echo dateecho `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 fileeval ls $redirect file

这里写图片描述

当使用eval时候,第一次扫描将$redirect替换为>,第二次执行ls > file,因此完成重定向功能。

eval可以取得最后的参数:eval echo \$$#

这里写图片描述

用eval命令创建指向变量的“指针”,有点类似第一点

#!/bin/bashx=10ptr=xeval echo \$$ptreval $ptr=20eval echo \$$ptr 

结果是:

1020

关于eval参考了这篇博客

原创粉丝点击