从带有位置参数的字符串执行 BASH shell
Posted
技术标签:
【中文标题】从带有位置参数的字符串执行 BASH shell【英文标题】:BASH shell execution from string with positional parameters 【发布时间】:2017-11-20 03:47:48 【问题描述】:当我尝试运行下面的代码时,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
任何帮助将不胜感激!
【问题讨论】:
使用简单的字符串连接和引号构建命令行是在玩火。 也许可以,但是有什么更好的方法来获取现有文件的小时数? 使用shell数组 相关阅读:mywiki.wooledge.org/BashFAQ/050 感谢您的网址和建议! 【参考方案1】:$4
是双引号。 虽然有单引号,但它包含在双引号中。所以单引号只是字符串的一部分,它不会保留$
的字面意思。这样你就可以逃脱$
:
y=".mp4 | awk 'print \$4' | awk -F\":\" '/1/ print \$2'"
或者,在整个部分使用单引号:
y='.mp4 | awk "print \$4" | awk -F':' "/1/ print \$2"'
【讨论】:
【参考方案2】:像这样连接变量以构建命令行某种可以工作,但是引用inin变量不引用任何内容,它们只会被视为文字引号.
这种工作(但很可怕):
$ x=prin; y="tf %f\\n"; z=" 123456789"
$ $x$y$z
123456789.000000
这不是你想要的:
$ z='"foo bar"'; printf $y ; echo
"foo
printf
不是一个参数 foo bar
,而是得到两个参数 "foo
和 bar"
。
【讨论】:
【参考方案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)"
【讨论】:
感谢您的示例。我是 bash shell 脚本的新手(好像你不知道)。在您的示例中,结果如何返回?用任务调用它? time=do_thing "$(cat /etc/hour.conf)" 函数的工作方式与常规命令一样。do_thing "$(cat /etc/hour.conf)"
会将其输出打印到标准输出。如果要捕获输出,请执行time=$(do_thing "$(cat /etc/hour.conf)")
。如果你想通过管道将它传递给另一个命令,请执行do_thing "$(cat /etc/hour.conf)" | awk | sed | grep
。
谢谢!感谢您的帮助!
你甚至不需要这个函数,只要做date -r "/blah$i.mp4" | awk '...'
就可以了以上是关于从带有位置参数的字符串执行 BASH shell的主要内容,如果未能解决你的问题,请参考以下文章