Ein Bash-Skript, das enthält
for i in {a,b}-{1,2}; do
echo $i;
done
druckt
a-1
a-2
b-1
b-2
wenn ausgeführt. Dies ist, was ich erwartet hatte - als das {a,b}
Konstrukt erweitert wird.
Wenn jedoch (ein anderes) Skript enthält
v={a,b}-{1,2}
echo $v
es druckt
{a,b}-{1,2}
Das ist nicht das, was ich erwartet hatte. Ich habe erwartet, dass es gedruckt wird a-1 a-2 b-1 b-2
. Offensichtlich ist das {a,b}
Konstrukt nicht erweitert.
Ich kann es so erweitern
v=$(echo {a,b}-{1,2})
Aufgrund dieser Beobachtungen habe ich zwei Fragen: 1) Wann wird das {a,b}
Konstrukt erweitert? 2) Ist $(echo {a,b}-{1,2})
die bevorzugte Methode, um bei Bedarf eine Erweiterung auszulösen?
bash
brace-expansion
René Nyffenegger
quelle
quelle
=
. Zum Beispielv=a-1 a-2
wird nicht funktionieren.v=a-1 a-2
meansassign 'a-1' to variable v and run 'a-2'
v=(a-1 a-2)
weist das Array der Variablen zuv
.v+=(b-1 b-2)
hängt daran an.Antworten:
Das Bash-Handbuch besagt Folgendes:
Die Klammererweiterung ist nicht in der Liste enthalten, daher wird sie für die Zuweisung nicht ausgeführt
v={a,b}-{1,2}
. Wie von @Wildcard erwähnt, wäre die einfache Erweiterungv=a-1 v=b-1 ...
um sowieso sinnlos.Bei der Ausführung von
echo $v
gilt außerdem Folgendes:Die Klammererweiterung erfolgt vor der variablen Erweiterung, sodass die zugewiesenen Klammern
$v
nicht erweitert werden.Aber Sie können so etwas tun:
Das Erweitern mit
$(echo ...)
sollte funktionieren, wenn die zu erweiternde Zeichenfolge kein Leerzeichen enthält und daher keine Probleme mit der Wortteilung auftreten. Ein besserer Weg könnte sein, eine Array-Variable zu verwenden, wenn Sie können.Speichern Sie z. B. die Erweiterung in einem Array und führen Sie einen Befehl mit den erweiterten Werten aus:
quelle
Ein interessanter Punkt. Möglicherweise hilfreich ist der folgende Auszug aus
man bash
:Beachten Sie, dass die Klammererweiterung NICHT in der Liste aufgeführt ist.
Es bleibt jedoch die Frage: Woher weiß die Shell, dass es sich um eine variable Zuweisung handelt, die also keiner Klammererweiterung unterliegt? Oder genauer gesagt, wo wird die Analysesequenz so geklärt und kodiert, dass die Shell definiert wird, um Variablenzuweisungen zu identifizieren, bevor sie die Klammererweiterung ausführt? (Dies
bash
funktioniert natürlich so , aber ich habe nicht die genaue Dokumentationsreihe gefunden, die dies beschreibt.)quelle
LESS=+/SIMPLE man bash
) beantworten .Meines Wissens nach wird {a, b, c} erweitert, wenn es direkt wiedergegeben oder mit einem Befehl verwendet wird, zB: mkdir ~ / {a, b, c}, aber wenn es auf eine Variable gesetzt ist, sollte es vorher ausgewertet werden es wiedergeben oder als Argument verwenden!
da Sie "a" gefolgt von "b" in alphabetischer Reihenfolge [az] und "1" gefolgt von "2" in dezimaler Reihenfolge [0-9] haben: Sie können doppelte Punkte ".." in Komma "verwenden, "
quelle
v
wurde nicht gesetzt "a-1 a-2 b-1 b-2" auf die Zeichenkette. Oder zumindest, warum kein Fehler ausgegeben wurde, wenn Sie den Befehl eingeben:v=a-1 v=a-2 v=b-1 v=b-2
(auf den die Variablenzuweisung erweitert werden sollte). Das ist eine gute Frage. das beantwortet es nicht wirklich.Das Zuweisen einer Variablen in bash erweitert den Ausdruck nicht.
Für dieses kleine Skript enthält x
"*"
und nicht die Erweiterung von"*"
:Einige Werte sind jedoch erweitert, vgl. die nette antwort von ilkkachu.
Ausdrücke werden bei der Auswertung erweitert.
So was:
Oder so:
Oder so:
Das Auslösen
$()
ist ziemlich häufig und wird meiner Meinung nach bevorzugteval
, aber das Beste ist wahrscheinlich, die Auswertung erst dann auszulösen, wenn die Variable tatsächlich in einem Befehl verwendet wird.quelle