【问题标题】:BASH shell execution from string with positional parameters从带有位置参数的字符串执行 BASH shell
【发布时间】: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数组
  • 感谢您的网址和建议!

标签: linux bash shell awk positional-parameter


【解决方案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,而是得到两个参数 "foobar"

    【讨论】:

      【解决方案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 '...'就可以了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      相关资源
      最近更新 更多