如何从 bash 变量中删除 ASCII 空格/eols?

如何从 bash 变量中删除 ASCII 空格/eols?

我尝试过以下方法:

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;提供的分隔符-表示为标准输入而不是实际文件执行此操作-在某些实现中可以省略,但这不是标准/可移植的)。

ksh93要回答有关删除/mkshbash中的空格的问题zsh

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"

>>是一个输出重定向运算符,您可能会与 the<<<<-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>序列将被删除。

或者,外部引号 where~被扩展(包括:赋值中的 after 后)并且\<newline>也被删除:

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

(使用bash,export PATH=... 也可以在这里工作,但不适用于所有其他 shell)。

在 中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变量,如 incshtcsh

相关内容