当我尝试运行下面的代码时,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
非常感谢任何帮助!
答案 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 bar
,printf
获取两个参数"foo
和bar"
。