Verwenden Sie die Parametererweiterung, um die Ausgabe einer anderen Erweiterung zu ändern

Verwenden Sie die Parametererweiterung, um die Ausgabe einer anderen Erweiterung zu ändern

Ich versuche, die Bash-Parametererweiterungen zu verwenden, um die Ausgabe einer Befehlsersetzung oder einer anderen Parametererweiterung zu ändern.

Die folgenden verschachtelten Erweiterungen funktionieren in Zsh recht gut, führen jedoch in Bash zu einem „falschen Substitutionsfehler“:

${${PWD##*/}//trunk/latest}

oder

${$(basename $PWD)//trunk/latest}

die Ausgabe sollte der letzte Ordner des sein $PWD, ersetzt durch latestwenn mein aktuelles Verzeichnis isttrunk

so /home/user/trunksollte werdenlatest

Gibt es ein Bash-Äquivalent, das das Verketten von Erweiterungen ohne die Verwendung von Variablen oder Pipes ermöglicht? Oder erlauben Bash-Erweiterungen als Eingabe nur Zeichenfolgen oder einfache Variablen?

Antwort1

Nein, diese Verschachtelung von Substitutionsoperatoren ist einzigartig für zsh.

Beachten Sie, dass Sie mit zsh„Gefällt mir“ (t)cshauch „ ausführen können ${PWD:t:s/trunk/latest/}.

Obwohl bashdiese CSH-Verlaufsmodifikatoren auch für die Verlaufserweiterung unterstützt werden, werden sie für die Parametererweiterungen nicht unterstützt.

Verwenden Sie hier mit basheine temporäre Variable:

var=${PWD##*/} var=${var//trunk/latest}

Antwort2

Versuchen Sie Folgendes mit Bash:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

oder mit einem Befehl:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

Das Ergebnis liegt vor${BASH_REMATCH[1]}

Antwort3

Möchtest du...?

PWD=latest

Ich sehe keine Methode für Ihre Anfrage. Wenn Sie alles durch $PWDlatest ersetzen möchten, ist die beste Möglichkeit, dies zu tun, jedoch, cddurch latest zu ersetzen.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

...wodurch Sie zur neuesten Version gelangen und den Pfadnamen auf stdout ausgeben. Sie können genau dorthin zurückkehren, wo Sie hergekommen sind, indem Sie es cd -noch einmal tun. Sie können dasselbe mit tun $CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

verwandte Informationen