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 bar
,printf
得到两个参数 "foo
和 bar"
。
当我尝试 运行 下面的代码时,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 bar
,printf
得到两个参数 "foo
和 bar"
。