Wie entferne ich ASCII-Leerzeichen/EOLs aus Variablen in Bash?

Wie entferne ich ASCII-Leerzeichen/EOLs aus Variablen in Bash?

Ich habe Folgendes versucht:

export PATH=>>-
$HOME/.cargo/bin:
$HOME/.bkaradzic/bx/tools/bin/linux:
$HOME/.bkaradzic/bimg/tools/bin/linux:
$HOME/.dotnet:
$HOME/.android-ndk-r17b:
$PATH

export PATH=${PATH//$'\r'/}
export PATH=${PATH//$'\n'/}
export PATH=${PATH//$'\x20'/}

Und weiterhin

-bash: /home/hydroper/.cargo/bin:: No such file or directory
-bash: /home/hydroper/.bkaradzic/bx/tools/bin/linux:: No such file or directory
-bash: /home/hydroper/.bkaradzic/bimg/tools/bin/linux:: No such file or directory
-bash: /home/hydroper/.dotnet:: No such file or directory
-bash: /home/hydroper/.android-ndk-r17b:: No such file or directory

Irgendwelche Vorschläge?

Antwort1

Sie scheinen zu glauben, dass die erste Zeile eine Erweiterung des Pfads einleitet. Das stimmt nicht. Die erste Zeile ist ein vollständiger Befehl.

export PATH= >> -

Die obige Zeile, die zum besseren Verständnis mit einigen Leerzeichen geschrieben wurde, setzt PATHauf eine leere Zeichenfolge und hängt die Ausgabe des Befehls an die Datei an -.

Die folgende Zeile ist der nächste Befehl

$HOME/.cargo/bin:

Dies wird zu dem Namen eines Verzeichnisses erweitert, das wahrscheinlich auf Ihrem System existiert, plus dem Doppelpunkt. Das Ergebnis ist

-bash: /home/hydroper/.cargo/bin:: Keine solche Datei oder kein solches Verzeichnis

Antwort2

Klingt, als ob Sie etwas möchten wie:

export PATH="$(paste -sd : - << EOF
$HOME/.cargo/bin
$HOME/.bkaradzic/bx/tools/bin/linux
$HOME/.bkaradzic/bimg/tools/bin/linux
$HOME/.dotnet
$HOME/.android-ndk-r17b
$PATH
EOF
)"

paste -sist der Befehl zum Verbinden aller Zeilen einer Datei (mit dem mit -d; ​​angegebenen Trennzeichen -).tun Sie es für stdin statt für eine tatsächliche Datei, -kann bei einigen Implementierungen weggelassen werden, aber das ist nicht Standard/portabel).

Um Ihre Frage zum Entfernen von Leerzeichen in ksh93/ mkshoder bashzu beantworten zsh:

PATH=${PATH//[[:space:]]}

würde alle Leerzeichen entfernen, auch ASCII-Zeichen, einschließlich des Zeilenumbruchzeichens. Die Liste der übereinstimmenden Zeichen hängt von der Ländereinstellung und dem System ab (beispielsweise enthalten nicht alle Systeme das geschützte Leerzeichen), aber alle ASCII-Zeichen (TAB, LF, VT, FF, CR, SPC) sind immer enthalten.

Um dieses Zeilenumbruchzeichen $PATHüberhaupt einzufügen, hätten Sie Folgendes benötigt:

export PATH="
$HOME/.cargo/bin:
$HOME/.bkaradzic/bx/tools/bin/linux:
$HOME/.bkaradzic/bimg/tools/bin/linux:
$HOME/.dotnet:
$HOME/.android-ndk-r17b:
$PATH"

>>ist ein Ausgabeumleitungsoperator. Sie könnten ihn mit den Here-Doc-Operatoren oder verwechseln <<. <<-Aber selbst dann dienen <<und <<-zur Umleitung der Eingabe, sodass Sie ihn immer noch auf einen Befehl anwenden müssen, der seine Eingabe liest, wie pasteim obigen Beispiel, und Befehlssubstitution ( $(...)im obigen Beispiel) verwenden müssen, damit die Ausgabe dieses Befehls als Argument an übergeben wird export.

Beachten Sie, dass Sie auch Folgendes tun können:

export PATH="\
$HOME/.cargo/bin:\
$HOME/.bkaradzic/bx/tools/bin/linux:\
$HOME/.bkaradzic/bimg/tools/bin/linux:\
$HOME/.dotnet:\
$HOME/.android-ndk-r17b:\
$PATH"

Innerhalb von doppelten Anführungszeichen (und Sie benötigen die doppelten Anführungszeichen, damit diese $HOMEerweitert werden) können Sie \am Ende der Zeile verwenden, um eine langelogischLinie in mehrerephysische. $PATHwürdenichtEnthält die \<newline>Sequenz Zeichen für eine neue Zeile, wird sie entfernt.

Oder außerhalb der Anführungszeichen, wo ~es erweitert wird (einschließlich nach :„wenn“ in Zuweisungen) und \<newline>auch entfernt wird:

PATH=\
~/.cargo/bin:\
~/.bkaradzic/bx/tools/bin/linux:\
~/.bkaradzic/bimg/tools/bin/linux:\
~/.dotnet:\
~/.android-ndk-r17b:\
$PATH
export PATH

(mit bashwürde export PATH=... hier auch funktionieren, aber nicht in allen anderen Shells).

In zshkönnten Sie Folgendes tun:

path=(
   ~/.cargo/bin
   ~/.bkaradzic/bx/tools/bin/linux
   ~/.bkaradzic/bimg/tools/bin/linux
   ~/.dotnet
   ~/.android-ndk-r17b
   $path
)

oder

path[1,0]=(
   ~/.cargo/bin
   ~/.bkaradzic/bx/tools/bin/linux
   ~/.bkaradzic/bimg/tools/bin/linux
   ~/.dotnet
   ~/.android-ndk-r17b
)

wie in ist zshdas $pathArraygebundenzur $PATHVariable wie in cshoder tcsh.

verwandte Informationen