【问题标题】:Setting an argument with bash [duplicate]使用 bash 设置参数 [重复]
【发布时间】:2012-11-02 03:58:48
【问题描述】:

我经常运行一个简单的 bash 命令:

rpm -Uvh --define "_transaction_color 3" myPackage.rpm

正常工作。

但现在我正在尝试将其编写成 bash 文件,并使其更加灵活:

#!/bin/bash
INSTALL_CMD=rpm
INSTALL_OPT="-Uvh --define '_transaction_color 3'"

${INSTALL_CMD} ${INSTALL_OPT} myPackage.rpm

但是,这会不断产生错误:

error: Macro % has illegal name (%define)

错误来自--define 和引用的_transaction_color 的处理方式。
我尝试了各种转义、不同的措辞,甚至使 INSTALL_OPT 成为一个数组,由 ${INSTALL_OPT[@]} 处理。

到目前为止,我的尝试没有奏效。
显然,我想要的非常简单。我只是不确定如何完成它。

如何让 bash 正确处理我的 --define 参数?

【问题讨论】:

  • 你试过INSTALL_OPT='-Uvh --define _transaction_color 3',对吧?
  • @sampson-chen:试过了。 “错误:宏 %_transaction_color 的主体为空”。
  • 这是因为 bash 将您的参数读取为 -Uvh--define'_transaction_color3'。在这种情况下,您必须使用数组(如下 Barmar 的回答所示):INSTALL_OPT=(-Uvh --define '_transaction_color 3')。然后${INSTALL_CMD} "${INSTALL_OPT[$@]}" myPackage.rpm 工作(用双引号,正如他提到的)。

标签: linux bash unix


【解决方案1】:

问题是在变量替换后引号没有被处理。所以看起来您正在尝试定义一个名为 '_transaction_color 的宏。

尝试使用数组:

INSTALL_OPT=(-Uvh --define '_transaction_color 3')

然后:

"$INSTALL_CMD" "${INSTALL_OPT[@]}" myPackage.rpm

${INSTALL_OPT[@]} 放在双引号内以获得重新引用非常重要。

【讨论】:

  • 如果你编辑你的帖子并删除evil,我只会+1。它是可怕的!只留下一个数组,因为这是唯一的好习惯!
  • 如果您使用不受信任的用户输入,则 Eval 是邪恶的。如果您将它与自己的数据一起使用,那还不错。
  • +1 表示数组答案——这是正确处理可能包含空格的多个单词的唯一方法。
  • 是的,或者echo "$CMD $OPT blahblah" | /bin/bash... 这比eval@gniourf_gniourf 更邪恶吗?
  • @Nate 它执行重新引用。 Arrays 对此进行了解释:如果单词被双引号引起来,...${name[@]} 将 name 的每个元素扩展为一个单独的单词。
【解决方案2】:

这可能是空间分词的 bash 问题:

试试:

#!/bin/bash

IFS=$'\n'

INSTALL_CMD=rpm
INSTALL_OPT='-Uvh'
INSTALL_OPT_DEFINE='--define _transaction_color 3'

${INSTALL_CMD} ${INSTALL_OPT} ${INSTALL_OPT_DEFINE} myPackage.rpm

【讨论】:

  • 我怀疑--define 要求宏名称和值在一个参数中,所以这行不通。
  • @Barmar 好点,我不太确定那部分;更新了我的答案。
  • @sampson-chen:尝试设置 IFS 并按照您的描述分解选项。结果:“-Uvh:未知选项”。 (我不明白为什么......但这就是我得到的错误)
  • @abelenky:尝试删除 INSTALL_OPT='-Uvh' 周围的引号(或使用双引号)。另外,我在原始答案中错误地使用了反引号而不是单引号,以防您复制和粘贴任何内容。
  • 我看到了反引号,并假设您的意思是常规刻度(但我尝试了两种方法来确定)。看起来@Barmar 的回答很有效;感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2018-05-11
  • 2018-10-01
  • 2019-11-05
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多