Linux 使用bash设置参数

Linux 使用bash设置参数,linux,bash,unix,Linux,Bash,Unix,我经常运行一个简单的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 但是,这会不断产生错误: erro

我经常运行一个简单的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)
错误来自于如何定义和处理引用的交易颜色。
我尝试了各种转义,不同的措辞,甚至使
INSTALL\u OPT
成为一个数组,用
${INSTALL\u OPT[@]}
处理

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


如何让bash正确地处理我的
——定义
参数?

问题是变量替换后引号没有被处理。因此,看起来您正在尝试定义一个名为
“\u transaction\u color
的宏

尝试使用数组:

INSTALL_OPT=(-Uvh --define '_transaction_color 3')
然后:


${INSTALL_OPT[@]}
放在双引号内以获取请求是很重要的。

在空格上拆分单词可能是一个bash问题:

尝试:


你已经试过了
INSTALL\u OPT='-Uvh--define\u transaction\u color 3'
,对吧?@sampson chen:试过了。“错误:宏%\u transaction\u color的主体为空”。这是因为bash将您的参数读取为
-Uvh
-define
'\u transaction\u color
3'
。在这种情况下,必须使用数组(如Barmar的回答中所示):
INSTALL\u OPT=(-Uvh--define'\u transaction\u color 3')
。然后
${INSTALL\u CMD}“${INSTALL\u OPT[$@]}”myPackage.rpm
可以工作(如他所说,使用双引号)。我怀疑
--define
需要宏名称和值在一个参数中,所以这不起作用。@Barmar很好的一点,我对这部分不太确定;更新了我的答案。@sampson chen:尝试设置IFS,并按照您的描述分解选项。结果:“-Uvh:未知选项”。(我不明白为什么……但这就是我得到的错误)@abelenky:尝试删除
INSTALL_OPT='-Uvh'
(或使用双引号)周围的引号。此外,我在原始答案中错误地使用了反勾号而不是单引号,以防您复制和粘贴任何内容。我看到了反勾号,并假设您指的是常规的勾号(但我尝试了两种方法来确保)。看起来@Barmar的答案是有效的;谢谢你的努力。我只会
+1
如果你编辑你的帖子并删除
邪恶的东西。太可怕了!只需将其中一个保留在阵列中,因为这是唯一的好做法!如果您使用的是不受信任的用户输入,则Eval是邪恶的。如果你用它来处理你自己的数据,那就没那么糟糕了。数组答案+1——这是正确处理可能包含空格的多个单词的唯一方法。是的,或者
echo“$CMD$OPT blahblah”|/bin/bash
。。。这比“代码”评估的邪恶程度要小吗?它执行重新引用。这是在:如果这个词是双引号
${name[@]}
将name的每个元素展开为一个单独的单词。
"$INSTALL_CMD" "${INSTALL_OPT[@]}" myPackage.rpm
#!/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