【问题标题】:BASH: "Quoted out": Passing variable inside single quotesBASH:“引用”:在单引号内传递变量
【发布时间】:2015-10-12 10:59:38
【问题描述】:

我需要为 cron 自动运行脚本“myscript”。它需要一些 dbus 功能,所以我必须创建一个调用 myscript 的包装脚本,如下所示:

#!/bin/bash
# this is a wrapper script
# Do some computation here
env `dbus-launch` sh -c 'trap "kill $DBUS_SESSION_BUS_PID" EXIT; /home/username/bin/myscript myarguments'

如果我硬编码“myarguments”的值,一切都会按预期工作。但是,如果包装器从命令行获取“myarguments”,我不知道如何将它传递给 myscript。

(是的,我可以将值写到文件中,并让 myscript 将其读入,但非常感谢仅 bash 的解决方案)

【问题讨论】:

  • 硬编码值从命令行获取是什么意思?
  • 就目前而言,传递给 myscript 的参数是 myarguments,我需要将其输入到脚本中。如果包装脚本是从 cron 调用的,它会像这样调用: $>/home/user/bin/wrapper newargs 问题是我想不出任何方法将 newargs 传递给 myscript,因为 sh -c 需要一个带引号的字符串 - 因此我不能在其中放入任何 $variable。抱歉,如果这不再有意义..

标签: bash debian parameter-passing


【解决方案1】:

您可以使用 $1 作为脚本接收的第一个参数的引用。 如果您的“myarguments”值中有空格,则必须引用它。 您可以通过搜索“bash arguments”找到更多详细信息。 如果您没有在引用的字符串之间放置任何空格,则可以将多个引用的字符串作为一个参数传递。 示例:

env `dbus-launch` sh -c 'trap "kill $DBUS_SESSION_BUS_PID" EXIT; /home/username/bin/myscript '"$1"

【讨论】:

  • 太棒了。我认为 sh -c 需要一个 single 带引号的字符串,但显然它不需要,所以谢谢!
【解决方案2】:

诀窍是在包装脚本中将所有参数作为一个引用它们:

$> wrapper-script.sh "param1 param2 param3"

#!/bin/bash
# this is a wrapper script
# Do some computation here
env `dbus-launch` sh -c 'trap "kill $DBUS_SESSION_BUS_PID" EXIT; /home/username/bin/myscript'"${@}"

这样sh -c可以正确解析它们(注意"${@}"之前的单引号)

【讨论】:

  • 谢谢,这也有效。不过,我现在只有一个论点,所以 1 美元对我来说同样好。谢谢
  • @kabZX:好的!我后来看到了 Vuk Vojta 的回答,实际上这里不需要 ${@} 并且 $1 就足够了(因为无论如何我们都使用单个参数)但是如果您想概括并向 sh -c 添加更多参数,这就是方法。请注意,这仅适用于无空格参数(否则您必须将参数与其他字符分开并使用$IFS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2020-02-03
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多