Ich möchte die Variablensubstitution für eine bestimmte Zeichenfolge verwenden, auf die ich über einen Befehl zugreife. Wenn ich beispielsweise etwas in meine Zwischenablage kopiere, kann ich wie folgt darauf zugreifen.
$ xclip -o -selection clipboard
Here's a string I just copied.
Wenn ich es einer Variablen zuordne, kann ich es durch Variablen ersetzen.
$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.
Gibt es jedoch eine Möglichkeit, eine Variablensubstitution durchzuführen, ohne sie einer Variablen zuzuweisen? Konzeptionell so etwas.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Diese Syntax schlägt fehl, da es var
sich um einen Variablennamen und nicht um eine Zeichenfolge handeln sollte.
bash
. (Und drängt mich erneut in Richtung Migrationzsh
.)Ja, das kannst du machen - irgendwie. Es ist wirklich nicht schön. Es ist eher inline als verschachtelt. Das Problem ist, dass Sie den Wert des zu erweiternden Parameters bearbeiten müssen. Wenn dieser Parameter keinen Wert hat, werden Sie nicht viel tun. Sie können den Wert also beim Erweitern zuweisen und es handelt sich kaum um eine Verknüpfung.
Ich benutze die
$0
Parametererweiterung innerhalb der Kette, um die Zuordnung zu verbergen . Es weist den Wert der Variable innerhalb einer verschachtelten Zuweisungserweiterung zu. Das Äußere hat Vorrang - aber weil es sich nur auf das ausdehnt, was das Innere tut, ist es schwer zu sagen. Wenn wir jedoch die innere Erweiterung zum Schweigen bringen und sie dann ändern, können Sie das bekommen, was Sie wollen. Nachdem Sie Ihre Zeichenfolge in meine Zwischenablage kopiert haben (ich habe sie nichtxclip
- nurxsel
), wird sie gedruckt:Es ist jedoch etwas klarer, was los ist, wenn Sie
$0
weglassen:Das druckt:
... weil die innere Zuordnung vor der Änderung erfolgt, die äußere Zuweisung jedoch, wie bereits erwähnt, Vorrang hat - und sich sowohl auf die Erweiterung der inneren Zuordnung als auch auf die modifizierte innere Erweiterung ausdehnt .
Natürlich funktioniert nichts davon, wenn der Zielparameter bereits zugewiesen ist - Sie können dies also nur dann sicher tun, wenn Sie die Variable zuerst leeren ... was ehrlich gesagt wahrscheinlich der bequemste Zeitpunkt ist, um sie schließlich zuzuweisen .
quelle
alias
Indirektion einfallen lassen , um es ein wenig bequemer zu machen - aber wenn es sich für Sie lohnt, sollten Sie eine Funktion einrichten, um sicheres Zitieren zu handhaben und etwas miteval
etwas Ähnlichem zu tun . w /eval
- Wenn Sie die ersten Zeichen der Ausgabemenge des Befehlssubs auf eine funktionsfähige Erweiterungssyntax bringen können, können Sie wahrscheinlich viel einfacher werden. Ich weiß, dass so etwas einfach wäre wxsel
- - es braucht stdin - aberxsel
?Wenn Sie keine Variable erstellen möchten, gibt es andere Möglichkeiten, eine Zeichenfolgenersetzung durchzuführen:
quelle
sed
stattdessen verwenden könnte, aber es sollte eher eine allgemeine Frage zum Verschachteln von Substitutionen sein.