
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 cond
nicht leer ist (unabhängig davon, ob es cond=false
oder cond=0
anstelle von ist cond=true
), wird der Wert von p2
erweitert. 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}