shell eval用法详解 命令替换

一、命令替换

shell 脚本中经常需要使用命令替换,但是总是会出现各种各样的问题。

其实,我们可以通过 set -x进行 shell 语法的调试,以窥全貌。

示例如下:

[root@localhost parameters]# cmd="sleep 5"
[root@localhost parameters]# set -x
[root@localhost parameters]# `echo $cmd`    # 1
++ echo sleep 5   							# 2 
+ sleep 5                                   # 3
[root@localhost parameters]# cmd="date"     
+ cmd=date
[root@localhost parameters]# `echo $cmd`    # 4
++ echo date                                # 5
+ date                                      # 6
Mon May 30 17:40:44 CST 2022
[root@localhost parameters]# 

可以看到, #1 命令的解析过程如下面的 #2 和 #3,最后成功执行了命令;
同理,#4 命令的解析过程如下面的 #5 和 #6,最后成功执行了命令。

[root@localhost parameters]# cmd="date" 
+ cmd=date
[root@localhost parameters]# `$cmd`              # 7
++ date						              	     # 8
+ Mon May 30 17:40:55 CST 2022                   # 9
+ local runcnf=1
+ local retval=127
+ [[ himxBH =~ i ]]
+ '[' '!' -S /var/run/dbus/system_bus_socket ']'
+ '[' '!' -x /usr/libexec/packagekitd ']'
+ '[' ']'
+ '[' 1 -eq 1 ']'
+ /usr/libexec/pk-command-not-found Mon May 30 17:40:55 CST 2022
bash: Mon: command not found...
+ retval=127
+ return 127
[root@localhost parameters]# 

可以看到, #7 命令的解析过程如下面的 #8 和 #9,最后 date 命令的输出结果又被解析为命令;于是发生了 shell 解析错误。


二、eval 命令

eval [arg ...]
              The args are read and concatenated together into a single command.  This command is then read and executed
              by the shell, and its exit status is returned as the value of eval.  If there are no args,  or  only  null
              arguments, eval returns 0.

可以看到,eval 命令用于读取参数并把参数拼接成一条命令。

[root@localhost parameters]# `eval echo $cmd`
++ eval echo date
+++ echo date
+ date
Mon May 30 17:57:24 CST 2022
[root@localhost parameters]# `echo $cmd`     
++ echo date
+ date
Mon May 30 17:57:43 CST 2022
[root@localhost parameters]# 

上面就是两条命令的解析过程。


三、命令的后台运行

假如我们有 n 个耗时的进程,并且进程执行的时间不确定。这时我们很难确定一个具体的时间来等待所有进程结束,同时让进程一个一个的运行显然也不现实。

这时我们就可以利用命令替换,将进程挂于后台运行,并等待进程退出。

[root@localhost platform]# vim demo.sh
#!/bin/bash


cmd1="sleep 10"
`eval echo $cmd1` &
CPLD_PROCESS[0]=$!

cmd2="sleep 10"
`eval echo $cmd2` &
CPLD_PROCESS[1]=$!


echo "===============1"
for((i=0;i<${#CPLD_PROCESS[*]};i++))
do
    echo "=============== start"
    echo ${CPLD_PROCESS[$i]}
    wait ${CPLD_PROCESS[$i]}
    echo "=============== finish"
done
echo "===============2"                                                                                                      
"demo.sh" [New] 21L, 345C written                                                                
[root@localhost platform]# chmod +x demo.sh 
"demo.sh" 21L, 345C written                                                                        
[root@localhost platform]# time ./demo.sh 
===============1
=============== start
6825
=============== finish
=============== start
6826
=============== finish
===============2

real    0m10.003s
user    0m0.000s
sys     0m0.004s
[root@localhost platform]# 

可以看到,执行多个10s休眠的进程,脚本也能让多个休眠同时后台运行,并及时退出脚本。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值