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

时间:2017-06-17 13:03:02

标签: linux bash shell awk positional-parameter

当我尝试运行下面的代码时,shell正在替换(因为它们没有被定义为bash变量)$ 4和$ 2 with blank。我的问题是,如何让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

非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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)"

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

连接这样的变量以构建命令行排序,但引用 中的变量并不引用任何内容,它们只会是作为字面引用。

这种作品(但很可怕):

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

这不能做你想做的事:

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

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