Können die Erweiterungsausdrücke von $ {var} -Parametern in bash verschachtelt sein?
Was ich habe ist dieses:
progname=${0%.*}
progname=${progname##*/}
Können diese verschachtelt werden (oder nicht) in eine Zeile, d.h. einen einzigen Ausdruck?
Ich versuche, Streifen Sie den Pfad und extension einer Skript-Namen, so dass nur die base-name für den linken. Die oben genannten zwei Zeilen funktionieren. Mein 'C' die Natur einfach fahren, mich zu verschleiern, diese noch mehr.
InformationsquelleAutor der Frage user71918 | 2009-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn von nest, du meinst so etwas wie dieses:
Dann Nein, Sie können nicht geschachtelt werden
${var}
Ausdrücken. Die bash-syntax expander wird es nicht verstehen.Allerdings, wenn ich verstehe dein problem Recht könnte man auf die Verwendung der
basename
Befehl Streifen Sie den Pfad von einem gegebenen Dateinamen, und wenn Sie die Erweiterung, die Streifen auch. Zum Beispiel, läuftbasename /some/path/to/script.sh .sh
zurückscript
.InformationsquelleAutor der Antwort Tim
Bash unterstützt indirekte Erweiterung:
Diese unterstützen sollte, die Verschachtelung, die Sie suchen.
InformationsquelleAutor der Antwort user1956358
Ein Alter thread aber vielleicht ist die Antwort, die die Verwendung der Umleitung:${!PARAMETER}
Z.B., sollten Sie die folgenden Zeilen:
InformationsquelleAutor der Antwort Deepak
Folgende option für mich gearbeitet hat:
Ausgabe:
InformationsquelleAutor der Antwort luferbraho
Dieser Schachtelung scheint nicht möglich zu sein, in der bash, aber es funktioniert im zsh:
InformationsquelleAutor der Antwort Nathan Kitchen
Tatsächlich ist es möglich, erstellen von verschachtelten Variablen in der bash, mit Hilfe von zwei Schritten.
Hier ist ein test-Skript basiert auf dem Beitrag von Tim, mit der Anregung von user1956358.
Ausgabe:
Gibt es viele nette tricks erklärt durch ausführen von 'info bash' von der Kommandozeile aus, dann Suche nach " Shell Parameter Expansion'. Ich lese ein paar selbst heute, verloren nur etwa 20 Minuten von meinem Tag, aber meine Skripts gehen, um zu bekommen eine viel besser...
Update: Nach mehr zu Lesen, ich schlage vor, diese alternative pro Ihre erste Frage.
Gibt es
InformationsquelleAutor der Antwort jmw86069
Den basename bultin könnte hier helfen, da Sie speziell die Teilung auf /in einem Artikel:
Es ist nicht wirklich schneller als die beiden line-Variante, aber es ist nur eine Zeile mit built-in-Funktionalität. Oder, verwenden zsh/ksh, die das können das Muster verschachteln Sache. 🙂
InformationsquelleAutor der Antwort dannysauer
Ich weiß, dies ist ein Alter thread, aber hier sind meine 2 cents.
Hier ein (zugegebenermaßen notdürftigem) bash-Funktion, die ermöglicht die gewünschte Funktionalität:
Hier ein kurzes test-script:
Die Ausgabe ist wie erwartet:
InformationsquelleAutor der Antwort diegog
Ausdrücke wie
${${a}}
funktionieren nicht. Das zu umgehen, können Sieeval
:Ausgabe
value
InformationsquelleAutor der Antwort Gavin Smith
Es ist ein 1-line-Lösung für die OP ' s ursprüngliche Frage, dem Basisnamen ein Skript mit der Dateiendung entfernt:
Hier ist eine andere, aber mit einem cheat für den basename:
Anderen Antworten verlassen haben die OP ' s ursprüngliche Frage und konzentrierte sich auf, ob es möglich ist, erweitern Sie das Ergebnis von Ausdrücken mit
${!var}
aber kam in der Einschränkung, dassvar
muss explizit die übereinstimmung mit einer Variablen-Namen. Having said that, es gibt nichts stoppen Sie mit einem 1-Zeiler Antworten, wenn Sie die Kette von Ausdrücken zusammen mit einem Semikolon.Wenn Sie wollen diese erscheinen wie eine einzige Anweisung, können Sie nest es in einer subshell, also
Eine interessante Verwendung ist die Umleitung funktioniert auf Argumente einer bash-Funktion. Dann können Sie Ihr nest bash-Funktion ruft zu erreichen mehrstufige verschachtelte Umweg, weil wir uns erlaubt ist zu tun, verschachtelte Befehle:
Hier ist eine demonstration der Dereferenzierung eines Ausdrucks:
Hier ist eine demonstration der multi-level-Dereferenzierung thru geschachtelte Befehle:
InformationsquelleAutor der Antwort Stephen Quan
Wenn die motivation ist "verschleiern" (ich würde sagen, rationalisieren) array-Verarbeitung in den Geist der Python ' s "Verstehens", erstellen eine Hilfsfunktion, führt die Operationen in der Reihenfolge.
Können Sie das Ergebnis mit einem schönen one-liner.
InformationsquelleAutor der Antwort nobar
eval können Sie tun, was Sie wollen:
Ausgabe:
Hello, world
InformationsquelleAutor der Antwort jgshawkey