2012-11-13 14 views
6

Mi capita spesso di eseguire una semplice comando bash:Impostazione di una discussione con bash

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

che funziona correttamente.

ma ora sto cercando di scrittura in un file bash, e renderlo più flessibile:

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

${INSTALL_CMD} ${INSTALL_OPT} myPackage.rpm 

Tuttavia, questo mantiene genera l'errore:

error: Macro % has illegal name (%define) 

L'errore è in arrivo da come viene gestito --define e il numero _transaction_color.
Ho provato una varietà di espressioni di sfasamento, fraseggio diverso, anche rendendo INSTALL_OPT un array, gestito con ${INSTALL_OPT[@]}.

Finora, i miei tentativi non hanno funzionato.
Chiaramente, quello che voglio è estremamente semplice. Non sono sicuro di come realizzarlo.

Come posso convincere bash a gestire correttamente l'argomento --define?

+0

Si è tentato 'INSTALL_OPT = '- Uvh --define _transaction_color 3'', giusto? –

+0

@ sampson-chen: provato. "errore: Macro% _transaction_color ha un corpo vuoto". – abelenky

+0

Questo perché bash legge gli argomenti come '-Uvh' e' --define' e ''_transaction_color' e' 3''. Devi ** usare un array in questo caso (come mostrato sotto nella risposta di Barmar): 'INSTALL_OPT = (- Uvh --define '_transaction_color 3')'. Quindi "$ {INSTALL_CMD}" $ {INSTALL_OPT [$ @]} "myPackage.rpm' funziona (con virgolette doppie, come ha menzionato). –

risposta

11

Il problema è che le quotazioni non vengono elaborate dopo la sostituzione delle variabili. Quindi sembra che tu stia cercando di definire una macro denominata '_transaction_color.

Provare a utilizzare una matrice:

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

poi:

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

E 'importante mettere ${INSTALL_OPT[@]} all'interno virgolette doppie per ottenere il requoting.

+1

'eval' è il male! –

+0

Mi basterà '+ 1' se modifichi il tuo post e togli la cosa' male'. È terribile! Lascia solo quello con l'array, poiché è l'unica buona pratica! –

+0

Eval è malvagio se stai usando un input utente non fidato. Se lo stai utilizzando con i tuoi dati, non è così male. – Barmar

0

potrebbe essere un problema di bash con la suddivisione delle parole sullo spazio:

Prova:

#!/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

Sospetto che '--define' richieda che il nome e il valore della macro siano in un singolo argomento, quindi questo non funzionerà. – Barmar

+0

@Barmar Buon punto, non ero troppo sicuro di quella parte; aggiornato la mia risposta. –

+0

@ sampson-chen: Provato a impostare IFS e suddividere le opzioni come descritto. Risultato: "-Uvh: opzione sconosciuta". (Non capisco perché ... ma questo è l'errore che ho ottenuto) – abelenky

Problemi correlati