if 语句内的变量替换

问题描述 投票:0回答:2

我无法控制以下 bash 脚本:

set -x
echo "$CMD"
if ${CMD}; then
  echo "Success"
fi

我正在尝试运行以下命令:

bash -c "echo first && true"
。我如何将其传递给
CMD
,有什么想法吗?请注意,这里 echo 和 true 都是我实际更复杂命令的替代品,这里我用这两个简单的命令替换,以更简单的方式突出显示问题。

我希望它能与以下内容一起使用:

❯ env CMD='bash -c "echo first && true"' bash magic.sh
+ echo 'bash -c "echo first && true"'
bash -c "echo first && true"
+ bash -c '"echo' first '&&' 'true"'
first: -c: line 1: unexpected EOF while looking for matching `"'

但似乎变量替换不允许这样做,因为参数被引用了。

bash shell variables substitution quoting
2个回答
2
投票

您可以将所有命令存储在 shell 脚本中,该脚本以适当的代码退出:

$ printf '#!/bin/bash\necho first && true\n' > /path/to/myscript
$ chmod +x /path/to/myscript
$ CMD=/path/to/myscript bash magic.sh

你还可以声明一个shell函数:

bash -c '
    myscript(){
        echo first && true
    }
    CMD=myscript
    . magic.sh
'

0
投票
# Revised using eval and second env-var
# Can another env-var be set as well?
Bash/001> cat test01.sh 
set -x
echo "$CMD"
if ${CMD}; then
  echo "Success"
fi
Bash/001> export BCMD='eval echo first && echo second && echo third && ls -l && true'
Bash/001> export CMD='bash -c $BCMD'
Bash/001> bash test01.sh 
+ echo 'bash -c $BCMD'
bash -c $BCMD
+ bash -c '$BCMD'
first
second
third
total 4
-rwxr-xr-x 1 josep users 55 Dec 27 20:45 test01.sh
+ echo Success
Success
© www.soinside.com 2019 - 2024. All rights reserved.