bash
  • shell
  • 2010-01-06 18 views 357 likes 
    357

    Ho un sacco di test sulle variabili in uno script di shell bash (3.00) in cui se la variabile non è impostata, assegna un valore predefinito, ad esempio:Assegnazione di valori predefiniti alle variabili di shell con un singolo comando in bash

    if [ -z "${VARIABLE}" ]; then 
        FOO='default' 
    else 
        FOO=${VARIABLE} 
    fi 
    

    mi sembra di ricordare c'è qualche sintassi per fare questo in una sola riga, qualcosa di simile a un operatore ternario, ad esempio:

    FOO=${ ${VARIABLE} : 'default' } 
    

    (anche se so che non funziona ...)

    Sono pazzo o esiste qualcosa del genere?

    +1

    Shell parametri sezione di espansione della shell bash di riferimento è un buon punti di partenza: https://tiswww.case.edu/php/chet/ bash/bashref.html # Shell-espansioni. –

    risposta

    618

    molto vicino a quello che hai postato, in realtà:

    FOO=${VARIABLE:-default} # If variable not set, use default. 
    

    Or, che assegnerà default-VARIABLE così:

    FOO=${VARIABLE:=default} # If variable not set, set it to default. 
    
    +24

    Se volessi trovare questo nella documentazione, per cosa sarebbe un google? Cercare su google con caratteri speciali come $ {: -} non è molto facile. –

    +14

    In risposta al solarmist: "bash variable assignment default" lasciami a questa pagina, e cercando la pagina di manuale di bash con 'variable ass' mi ha portato nella sezione giusta dopo ~ cinque 'next' – Mooshu

    +29

    Nota che è [* not * bash- specifico] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02) e funzionerà con l'intera famiglia di shell. È sicuro per gli script generici. –

    161

    Per argomenti della riga di comando:

    VARIABLE=${1:-DEFAULTVALUE}  
    

    che assegna al VARIABLE il valore del primo argomento passato allo script o il valore di DEFAULTVALUE se è stata approvata senza tale argomento.

    21

    vedere here sotto 3.5.3 (l'espansione di parametro shell)

    quindi nel tuo caso

    ${VARIABLE:−default} 
    
    11

    Poi c'è il modo di esprimere il tuo 'se' costruire più laconicamente:

    FOO='default' 
    [ -n "${VARIABLE}" ] && FOO=${VARIABLE} 
    
    +3

    questo è valido per x-compatibilità con shell precedenti –

    16

    Anche è possibile utilizzare come valore di default il valore di un'altra variabile

    avere un file defvalue.sh

    #!/bin/bash 
    variable1=$1 
    variable2=${2:-$variable1} 
    
    echo $variable1 
    echo $variable2 
    

    run ./defvalue.sh first-value second-value output

    first-value 
    second-value 
    

    ed eseguire ./defvalue.sh first-value uscita

    first-value 
    first-value 
    
    +0

    Grazie per aver mostrato un esempio con $ 1, $ 2 ... –

    119

    Se la variabile è stesso, allora

    : "${VARIABLE:=DEFAULT_VALUE}" 
    

    assegna DEFAULT_VALUE VARIABILE se non definito. Le doppie virgolette impediscono il globbing e la divisione delle parole.

    Vedere anche la Sezione 3.5.3, Shell Parameter Expansion, nel manuale di Bash.

    +4

    Mi ritrovo a riferire a questo di nuovo, e ancora e ancora !!! – chnrxn

    +12

    Questo trucco non era ovvio per me, usando il: built-in senza effetti per mangiare l'espansione di $ {..} MA lasciando il set VARIABILE. Fino ad ora lo stavo facendo: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" e mi sono sentito male per aver usato VARIABLE due volte. – dino

    +0

    Si scopre che NON FUNZIONA SEMPRE PER VARIABILI BASH-BUILTIN. È molto, molto strano Attualmente quelli a me noti sono 'HISTTIMEFORMAT' – Otheus

    7

    Ecco un esempio

    #!/bin/bash 
    
    default='default_value' 
    value=${1:-$default} 
    
    echo "value: [$value]" 
    

    Salva questo come script.sh e renderlo eseguibile. eseguirlo senza params

    ./script.sh 
    > value: [default_value] 
    

    corsa con param

    ./script.sh my_value 
    > value: [my_value] 
    
    10

    FWIW, è in grado di fornire un messaggio di errore in questo modo:

    USERNAME=${1:?"Specify a username"} 
    

    Questo visualizza un messaggio come questo ed esce con codice 1:

    ./myscript.sh 
    ./myscript.sh: line 2: 1: Specify a username 
    

    Un esempio più completo di tutto:

    #!/bin/bash 
    ACTION=${1:?"Specify 'action' as argv[1]"} 
    DIRNAME=${2:-$PWD} 
    OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} 
    
    echo "$ACTION" 
    echo "$DIRNAME" 
    echo "$OUTPUT_DIR" 
    

    uscita:

    $ ./script.sh foo 
    foo 
    /path/to/pwd 
    /tmp 
    
    $ export HOMEDIR=/home/myuser 
    $ ./script.sh foo 
    foo 
    /path/to/pwd 
    /home/myuser 
    
    • $ACTION assume il valore del primo argomento, ed esce vuote
    • $DIRNAME è la seconda argomentazione, e il valore predefinito è
    • $OUTPUT_DIR è il terzo argomento o $HOMEDIR (se definito), altrimenti /tmp. Funziona su OS X, ma non sono sicuro che sia portatile.
    1

    Per rispondere alla tua domanda e su tutte le sostituzioni di variabili

    echo "$\{var}" 
    echo "Substitute the value of var." 
    
    
    echo "$\{var:-word}" 
    echo "If var is null or unset, word is substituted for var. The value of var does not change." 
    
    
    echo "2- $\{var:=word}" 
    echo "If var is null or unset, var is set to the value of word." 
    
    
    echo "$\{var:?message}" 
    echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly." 
    
    
    echo "$\{var:+word}" 
    echo "If var is set, word is substituted for var. The value of var does not change." 
    
    Problemi correlati