BASH shell 从带位置参数的字符串执行

BASH shell execution from string with positional parameters

当我尝试 运行 下面的代码时,shell 正在用空格替换(因为它们未定义为 bash 变量)$4 和 $2。我的问题是,如何防止 bash 尝试评估 awk 的位置参数作为其变量? 我试过在位置参数周围加上双引号和单引号,但是,这并没有阻止 bash 将它们解释为局部变量而不是字符串。

这是我 echo "$x$i$y"

时返回的内容
date -r /root/capture/capture11.mp4 | awk '{print }' | awk -F":" '/1/ {print }'

代码:

#!/bin/sh
i=$(cat /etc/hour.conf)
x="date -r /root/capture/capture"
y=".mp4 | awk '{print }' | awk -F\":\" '/1/ {print }'"
$x$i$y

如有任何帮助,我们将不胜感激!

变量内插双引号。使用单引号,或像 $2.

这样转义它们

但是,您尝试将命令拆分为单独的变量的方式行不通。相反,您应该使用一个函数。那么你根本不需要处理引号和转义。例如:

do_thing() {
    date -r "/root/capture/capture.mp4" | awk '{print }' | awk -F':' '/1/ {print }'
}

do_thing "$(cat /etc/hour.conf)"

</code> 是双引号。 <em>虽然有单引号,但是包含在双引号里。所以单引号只是字符串的一部分,不会保留<code>$的字面意思。所以你可以转义 $:

y=".mp4 | awk '{print $4}' | awk -F\":\" '/1/ {print $2}'"

或者,在整个部分使用单引号:

y='.mp4 | awk "{print $4}" | awk -F':' "/1/ {print $2}"'

像这样连接变量以构建命令行有点可行,但在中引用变量不引用任何内容,它们'将被视为文字引号。

这种作品(但很糟糕):

$ x=prin; y="tf %f\n"; z=" 123456789"
$ $x$y$z
123456789.000000

这不是你想要的:

$ z='"foo bar"'; printf $y ; echo
"foo

不是一个参数 foo barprintf 得到两个参数 "foobar"