2016-07-18 26 views
2

Ich frage mich, ob es möglich ist, die letzten vier Zeilen im folgenden Beispiel zu reduzieren:bash: Entfernen leerer Parameter

#!/bin/bash 

function xxx { 
    echo $# 
    echo $1 
} 

[[ -n $SOME_ENV ]] && P="-Dabc=$SOME_ENV" 

if [[ -n $P ]]; then 
    xxx "$P" abc 
else 
    xxx abc 
fi 

Ersetzen des if-else-Fi von nur

xxx "$P" abc 

funktioniert, wenn $ P ist nicht leer, sonst nicht, weil "" immer noch als leerer Parameter gilt. Das Weglassen der Anführungszeichen um $ P funktioniert nicht, wenn SOME_ENV Leerzeichen enthält. Ich weiß, dass es mit "eval" möglich ist, aber eval ist böse: http://mywiki.wooledge.org/BashFAQ/048

Jede andere Lösung?

Antwort

5

Ich mag using an array die Beste. Eine Alternative, für die es sich lohnt, ist alternate value Substitution zu verwenden.

xxx ${P:+"$P"} abc 

Dies wird mit "$P" ersetzt werden, wenn $P und nicht leer gesetzt. Wenn es leer ist, wird das gesamte Wort entfernt. Die nette Sache ist, Sie könnten $P insgesamt loswerden.

xxx ${SOME_ENV:+"-Dabc=$SOME_ENV"} abc 
3

Wenn Sie Variable eine Option verwenden, p ihm ein Array machen:

p=() 
[[ -n $SOME_ENV ]] && p+=("-Dabc=$SOME_ENV") 

xxx "${p[@]}" abc 

Wenn p leer ist, dann "${p[@]}" nichts erweitert, so wie Sie wollen.

Zum Beispiel mit SOME_ENV ungesetzt, $# 1 ist, wie es sein sollte:

$ bash script 
1 
abc 

Mit SOME_ENV Satz, dann $# 2, wie es sein sollte:

$ SOME_ENV='1 2 3' bash script 
2 
-Dabc=1 2 3 
2

Sie testen bereits die Länge $SOME_ENV und setzen $P nur, wenn $SOME_ENV nicht leer ist. $P und $SOME_ENV sind entweder beide leer oder beide nicht leer. Haben Sie einen guten Grund, $P zu testen?

Ich würde die beiden Tests zusammenführen und dann einfach $P verschwinden lassen (es ist nur eine temporäre Variable in dem Code, den Sie gepostet haben). Etwas wie dieses:

if [[ -n $SOME_ENV ]]; then 
    xxx -Dabc="$SOME_ENV" abc 
else 
    xxx abc 
fi 
+0

Ihre Lösung ist perfekt, wenn man die letzten 4 Zeilen behalten würde. Aber ich möchte es loswerden. Ich möchte nur eine Zeile haben, die mit "xxx" beginnt. Das reale Beispiel enthält viel mehr als nur ein gewöhnliches "ABC". Ich möchte diese Redundanz vermeiden. – Henning

Verwandte Themen