Linuxシェルでのキャラクターエスケープの舞台裏で何が起こっているのかを説明していただけますか?私は次のことを試してみましたが、何がどのように(そしてどのように)起こっているのかを理解するのに成功しませんでした:
root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"
Hello!
root@sv01:~# echo -e "\\n Hello!"
Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!
そこで完全に迷子になったので、たとえば、3つのバックスラッシュが1つのバックスラッシュしか与えないのはなぜですか?最初の2つは1つにエスケープされ、3つ目はエスケープするものが見つからないのでスラッシュのままになります(最初の実験の行)が、3つ目は消えてしまいます。
なぜ4つから1つのバックスラッシュを取得してい\\\\ Hello
ますか?各ペアが1つのバックスラッシュ-> 2つのバックスラッシュを与えることを期待します。
そして、\ nエスケープするために最後のケースで3つのバックスラッシュが必要なのはなぜですか?それを得るために脱出の背景で何が起こっていますか?そしてそれは\\n
ケースとどう違うのですか?
前の行で何が起こっているかについての説明に感謝します。
echo -e
安全ではありません:echo
両方のオプションposix
とxpg_echo
実行時オプションが有効になっている場合、または同等のビルド時オプションでコンパイルされている場合、標準に従って動作します。安全な練習は使用することがあるprintf
ようにする方法を記述した上記のリンクのアプリケーション使用法と根拠の項を参照-代わりprintf
の代替として作用しますecho
。
echo -e
動作はとにかく標準で定義されていません-pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.htmlを参照してください。出力は完全に実装定義の入力でのリテラルのバックスラッシュのどこがあります場合にのみ許されるオプションは、-n
(標準規格に準拠した実装がありますことを意味しecho -e
、印刷-e
の出力にします)。