0

当我尝试运行下面的代码时,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 $4}' | awk -F\":\" '/1/ {print $2}'"
$x$i$y

任何帮助将不胜感激!

4

3 回答 3

3

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

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

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

do_thing "$(cat /etc/hour.conf)"
于 2017-06-17T13:20:02.920 回答
0

$4被双引号。虽然有单引号,但它包含在双引号中。所以单引号只是字符串的一部分,它不会保留$. 所以你可以逃避$

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

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

y='.mp4 | awk "{print \$4}" | awk -F':' "/1/ {print \$2}"'
于 2017-06-17T13:25:38.730 回答
0

像这样连接变量以构建命令行类型的作品,但变量的引号不引用任何内容,它们只会被视为文字引号。

这种作品(但很可怕):

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

这不符合您的要求:

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

而不是一个参数foo barprintf获取两个参数"foobar"

于 2017-06-17T14:03:05.220 回答