html tool

2019年2月26日星期二

bash反引号`使用




问题描述:

一个简单的bash for while
run_test()
{           
    EXEC_CMD=$1
    while [[ 1 == 1 ]]
    do   
        echo "${EXEC_CMD}"
        ${EXEC_CMD}                              #----------1
       
    done 
}           
run_test "bash replay_spe use_all"

1 的位置本来写的是
 `${EXEC_CMD}`

但是从执行结果上第二次无法执行 bash replay_spe use_all



解决:

修改为问题描述中没有反引号的代码就ok了,来解释一下

  • 反引号
两个反引号包围起来的字符串,将作为命令来运行,执行的输出结果作为该反引号的内容,称为命令替换
它有另一种更好的写法:$(command)
  反引号包围起来的字符串将被运行,取其结果

Shell script规范2.6.3节中写道:
Command substitution shall occur when the command is enclosed as follows:
$(command)
or (backquoted version):
`command`

而pope的目标是执行这个传入的 bash replay_spe use_all,而非执行这个 bash replay_spe use_all的屏幕输出,所以要在1中去掉反引号。
而错误中看到的第二次执行其实是while中的第一次执行,而第一次执行,是传入参数时就开始执行的。;)ok,6个icecream 值了,:)

参考:

https://www.jianshu.com/p/7f910c38e65e
https://www.jianshu.com/p/ed41f2e48464
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03

没有评论:

发表评论