2012-11-13 31 views
6

设置参数我经常运行一个简单的bash命令:使用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问题?

+0

您尝试过'INSTALL_OPT =' - UVH --define _transaction_color 3'',对不对? –

+0

@ sampson-chen:试过了。 “错误:宏%_transaction_color有空体”。 – abelenky

+0

这是因为bash将'-Uvh'和'--define'以及''_transaction_color'和'3''作为参数读取。你必须**在这种情况下使用一个数组(如Barmar的答案中所示):'INSTALL_OPT =( - Uvh --define'_transaction_color 3')'。然后'$ {INSTALL_CMD}“$ {INSTALL_OPT [$ @]}”myPackage.rpm'可以工作(用双引号,就像他提到的那样)。 –

回答

11

问题是在变量替换之后引号不会被处理。所以看起来你试图定义一个名为'_transaction_color的宏。

尝试使用数组:

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

则:

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

${INSTALL_OPT[@]}双引号内得到requoting是很重要的。

+1

'eval'是邪恶的! –

+0

如果你编辑你的帖子并删除邪恶的东西,我将只用'+ 1'。它是可怕的!只留下一个阵列,因为这是唯一的良好做法! –

+0

如果您使用不受信任的用户输入,则Eval是邪恶的。如果你使用自己的数据,它并不是那么糟糕。 – Barmar

0

这可能是一个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 
+0

我怀疑'--define'需要宏名和值在一个参数中,所以这不起作用。 – Barmar

+0

@Barmar好点,我不太确定那部分;更新了我的答案。 –

+0

@ sampson-chen:尝试设置IFS并按照您的描述分解选项。结果:“-Uvh:未知选项”。 (我不明白为什么......但那是我得到的错误) – abelenky