bash の変数から ASCII 空白/終止符を削除するにはどうすればいいですか?

bash の変数から ASCII 空白/終止符を削除するにはどうすればいいですか?

私は次のことを試しました:

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/mkshまたはbash内の空白の削除に関する質問に回答します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"

>>は出力リダイレクト演算子なので、<<または<<-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>シーケンスは削除されます。

または、引用符の外側では が~展開され (:代入時の後も含む)、\<newline>も削除されます。

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

( を使用するとbashexport 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のような変数に追加します。cshtcsh

関連情報