Bedingte Übergabe von Parametern an ein Skript

Bedingte Übergabe von Parametern an ein Skript

Ich habe ein Skript unter Linux laufen, das einige Parameter akzeptiert.
Ich würde gerne etwas tun wie:

if [[ $CONDITION == "true" ]]; then  
  script param1 --param2  
else
  script param1  
fi 

Ich möchte den Verzweigungspfad des if vermeiden.
Gibt es eine optimalere Möglichkeit, den zweiten Parameter zu übergeben?

Antwort1

Die erweiterbarste und robusteste Möglichkeit wäre wahrscheinlich die Verwendung eines Arrays zur Speicherung der optionalen Parameter:

params=()
if [[ $CONDITION == true ]]; then
    params+=(--param2)
fi
script param1 "${params[@]}"

Oder in Kurzform:

[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"

Dadurch wird die Wiederholung des konstanten Teils des Befehls vermieden und Sie können mehr als ein Argument in das Array einfügen, sogar den gesamten Befehl.

Beachten Sie, dass dies bei einem Array erforderlich ist: Wenn Sie das Array durch eine reguläre Variable ( params="--param2"; script param1 $params) ersetzen, müssen Sie die Variable entweder ohne Anführungszeichen erweitern, mit allen damit verbundenen Problemen, oder sie in Anführungszeichen erweitern. In diesem Fall übergeben Sie eine leere Zeichenfolge als Argument, wenn die Variable leer ist.

In einem einfachen Fall wie diesem kann auch die Erweiterung „alternativer Wert“ verwendet werden:

cond=x
p2="--param2"
script param1 ${cond:+"$p2"}

Wenn hier condnicht leer ist (unabhängig davon, ob es cond=falseoder cond=0anstelle von ist cond=true), wird der Wert von p2erweitert. Dies mag als weniger hässlich als Arrays angesehen werden, aber seien Sie bei der Platzierung der Anführungszeichen vorsichtig.

Siehe auch:

Antwort2

Eine vielseitige Möglichkeit hierfür besteht darin, die Argumente in einem Array festzulegen. Das einfachste Array ist die Liste der mit definierten Positionsparameter set. Sie können die Parameterliste der Reihe nach erstellen.

set -- param1
if [[ $CONDITION == "true" ]]; then  
    set -- "$@" --param2  
fi 

command "$@"  

Was man wie folgt reduzieren könnte:

set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"  

Wenn die Liste der Positionsparameter beibehalten werden muss, dann entweder:

  • Verwenden Sie eine Funktion:

    callcommand(){     set -- param1
                       [[ $CONDITION == "true" ]] && set -- "$@" --param2
                       command "$@"       
                 }
    callcommand
    
  • Oder verwenden Sie eine andere Array-Variable:

    paramArray=()
    paramArray+=(param1)
    [[ $CONDITION == "true" ]] && paramArray+=( "--param2" )
    command "${paramArray[@]}"
    

Antwort3

PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then  
  PARAMS+=" --param2"
fi
script ${PARAMS}

verwandte Informationen