2017-12-12 2 views
3

In Bash können Sie eine leere oder nicht definierte Variable mit diesem ersetzen:Zwei Bash-Substitutionen in einer Aussage?

${myvar:-replacement} 

Sie können auch Teilstrings in Variablen wie folgt ersetzen:

${myvar//replace this/by this} 

Jetzt möchte ich beide Substitutionen zu einem kombinieren: Wenn Variable ist undefiniert, setze sie auf replacement, ansonsten ersetze einen Teil davon durch etwas anderes.

Ich kann dies in zwei Zeilen ohne Probleme schreiben.

myvar=${myvar:-replacement} 
myvar=${myvar//replace this/by this} 

oder enger an meine Geschäftslogik widerspiegeln:

if [[ -n "${myvar:-}" ]]; then 
    myvar="${myvar//replace this/by this}" 
else 
    myvar="replacement" 
fi 

Gibt es eine Möglichkeit, beide Substitutionen in einer Aussage zu kombinieren/eine Zeile?

Ich habe dies versucht, ohne Erfolg:

myvar=${${myvar:-replacement}//replace this/by this} # bad substitution 

ich set -u in meine Skripte bin so, dass sie Fehler aus, wenn ich nicht definierten Variablen verwenden. Deshalb brauche ich das erste Sub auf undefined var.

+1

dies nicht möglich ist in 'bash' AFAIK – Inian

+1

Warum wir willst du immer Dinge in einer Zeile machen? Wenn es lesbar und nicht hässlich ist, lass es so wie es ist. – Maroun

+0

@MarounMaroun Sie könnten Recht haben. Ich erkannte gerade, dass ich beide Aussagen in einer Zeile schreiben konnte, getrennt durch ein Leerzeichen. Nicht sicher, ob das es einfacher oder schwerer macht, es zu lesen. –

Antwort

2

Soweit ich weiß, ist dies in Bash nicht möglich.

Das Beste, was Sie tun können, sie auf mehrere Zeilen schreibt, oder einen NOP-Befehl verwenden, oder verwenden Sie Dienstprogramme:

myvar=${myvar:-replacement} 
myvar=${myvar/src/dest} 
myvar=$(sed 's/src/dest/g' <<< ${myvar:-defaulttext})