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

在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参考了这篇博客

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值