Как удалить пробелы/eol ASCII из переменной в bash?

Как удалить пробелы/eol ASCII из переменной в bash?

Я попробовал следующее:

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'/}

И еще

-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

Какие-либо предложения?

решение1

Вы, кажется, думаете, что первая строка начнет расширение пути. Это не так. Первая строка — это полная команда.

export PATH= >> -

Строка выше, написанная с некоторыми пробелами для лучшего понимания, установит PATHпустую строку и добавит вывод команды в файл -.

Следующая строка — следующая команда

$HOME/.cargo/bin:

Это расширяется до имени каталога, который, вероятно, существует в вашей системе, плюс двоеточие. Результат:

-bash: /home/hydroper/.cargo/bin:: Такого файла или каталога нет

решение2

Похоже, вы хотите что-то вроде:

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 -sэто команда для объединения всех строк файла (разделитель указан с помощью -d; -означаетсделайте это для stdin вместо реального файла, -может быть опущен в некоторых реализациях, но это не является стандартным/переносимым).

Чтобы ответить на ваш вопрос об удалении пробелов, в ksh93/ mkshили :bashzsh

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

удалит все символы пробела, включая символы ASCII, включая символ новой строки. Список соответствующих символов зависит от локали и системы (например, не все системы включают неразрывный пробел), но все символы ASCII (TAB, LF, VT, FF, CR, SPC) всегда включены.

Чтобы вставить этот символ новой строки $PATH, вам понадобилось бы:

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

>>является оператором перенаправления вывода, вы можете путать с операторами <<or <<-here-doc. Но даже в этом случае <<и <<-перенаправляют ввод, поэтому вам все равно нужно использовать его в команде, которая считывает свой ввод, как pasteв примере выше, и использовать подстановку команд ( $(...)в примере выше) для вывода этой команды, который будет передан в качестве аргумента export.

Обратите внимание, что вы также можете сделать:

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

$HOMEВнутри двойных кавычек (а для их раскрытия двойные кавычки действительно нужны ) можно использовать \в конце строки, чтобы разбить длиннуюлогичныйлиния на несколькофизические. $PATHбынетсодержат символы новой строки, то \<newline>последовательность удаляется.

Или, за пределами кавычек, где ~раскрывается (в том числе после :when в назначениях) и \<newline>также удаляется:

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

bash, export PATH=... здесь также будет работать, но не во всех других оболочках).

В zsh, вы могли бы сделать:

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

или

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

как в zsh, $pathмассив естьсвязанныйк $PATHпеременной, как в cshили tcsh.

Связанный контент