2012-11-13 17 views
6

と引数を設定します。は、私は頻繁に簡単なbashコマンドを実行してbashを

しかし、今、私は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[@]}で処理しても、さまざまなエスケープやさまざまなフレーズを試しました。

これまでのところ、私の試みはうまくいきませんでした。
明らかに、私が望むものは非常に簡単です。私はそれを達成する方法だけではわかりません。

--define引数を適切に処理するためにbashを取得するにはどうすればよいですか?

+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 

それはrequotingを取得するために二重引用符の内側に${INSTALL_OPT[@]}を置くことが重要です。

+1

'eval'は悪です! –

+0

投稿を編集して「悪」を削除した場合は、「+ 1」のみになります。それはひどいです!それは唯一の良い練習であるので、配列で1つを残してください! –

+0

信頼できないユーザー入力を使用している場合、評価は悪です。あなた自身のデータでそれを使用しているなら、それほど悪くはありません。 – 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

関連する問題