2012-12-31 13 views
8

Eventuali duplicati:
Ternary operator (?:) in BashC'è un inline-if con assegnazione (condizionale ternario) in bash?

Se questo fosse AS3 o Java, vorrei fare le seguenti operazioni:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 

Ma in guscio, che sembra inutilmente complicato, che richiede diverse righe di codice, oltre a un bel po 'di codice ripetuto.

if [ $useDefault ]; then 
    fileName="$dirName/$defaultName.txt" 
else 
    fileName="$dirName/$customName.txt" 
fi 

Si può comprimere tutto in una sola riga, ma questo sacrifica immensamente la chiarezza.

C'è un modo migliore di scrivere un in linea if con assegnazione variabile nella shell?

+0

La risposta di William Purcell è meno diretta della mia, ma se l'ipotesi che "$ useDefault" controlli se utilizzare il nome predefinito o meno, potrebbe essere una soluzione più pulita. –

+0

Ho aggiornato la mia risposta per citare tutto correttamente. –

risposta

9

Non c'è ?: operatore condizionale nel guscio, ma si potrebbe rendere il codice un po 'meno ridondante come questo:

if [ $useDefault ]; then 
    tmpname="$defaultName" 
else 
    tmpname="$customName" 
fi 
fileName="$dirName/$tmpname.txt" 

Oppure si potrebbe scrivere la propria funzione di shell che si comporta come l'operatore ?::

cond() { 
    if [ "$1" ] ; then 
     echo "$2" 
    else 
     echo "$3" 
    fi 
} 

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt" 

sebbene sia probabilmente eccessivo (e valuta tutti e tre gli argomenti).

Grazie a Gordon Davisson per aver segnalato nei commenti che le citazioni nidificano all'interno di $(...).

+0

Mi piace molto la funzione 'cond', che è la ragione per cui ho accettato la risposta, anche se la prima soluzione salva anche il codice ripetitivo. – IQAndreas

+0

Dovresti lasciare il '$ (cond ...)' all'interno delle doppie virgolette (es. 'FileName =" $ dirname/$ (cond "$ useDefault" "$ defaultName" "$ customName"). Txt "') - - Questo eviterà qualche parsing extra quasi certamente indesiderato sulla stringa cond ritorni. –

+0

@GordonDavisson: ci ho pensato, ma lascia i riferimenti variabili '$ useDefault' al di fuori delle virgolette. Non sono sicuro che ci sia una buona soluzione. –

16

Basta scrivere:

fileName=${customName:-$defaultName}.txt 

Non tutto è lo stesso di quello che hai, perché non controlla useDefault. Invece, controlla solo se è impostato customName. Invece di impostare useDefault quando si desidera utilizzare l'impostazione predefinita, è sufficiente disattivare customName.

+0

Potresti fornire maggiori informazioni su questo operatore ': -'? (o almeno un nome che posso cercare con Google) – IQAndreas

+1

Cerca semplicemente ': -' nella pagina man di bash. Qualsiasi documentazione 'sh' descriverà ciò sotto intestazioni come' parameter expansion'. –

+4

Per 'bash', vedere [espansione parametri] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion); per la shell POSIX, vedere [espansione parametri] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02). –

Problemi correlati