以下のコマンドが印刷されますが、Smith
印刷されないのはなぜですか\Smith
?
echo \Smith
答え1
これバックスラッシュはシェル構文のエスケープ文字です。それ:
<newline>を除いて、後続の文字はリテラル値のままにする必要があります。 ... <バックスラッシュ> ...削除する必要があります。
改行文字やエスケープできるシェル特殊文字( 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 または タブ)ではないため、\S
同じ意味を持ちますS
。与えられた引数にリテラルバックスラッシュを含めるには、順番に、または別の引用演算子を使用してエスケープします。S
$
"
'
{
[
`
\
|
&
;
<
>
(
)
?
*
[
#
~
=
%
echo
\
echo \\Smith
または
echo '\Smith'
または
echo "\Smith"
(\
特別な意味は依然として二重引用符内に保持されますが、後ろにあるときは維持されず、後に、S
または\
改行文字が来るときにのみ保持されます。`
)$
"
多くのecho
実装では、\
引数で見つかったときに特別な処理を実行します(通常は従わないがS
保証されません)、次のように使用できますprintf
。
printf '%s\n' '\Smith'
注:これは例で参照されていないケースに対して指定された動作ですが、別の方法で参照することも、ファイル内でread
変更することもできます。
答え2
\S
エスケープされたS
場合は特殊文字ではないため提供されますS
。印刷するにはバックスラッシュを2倍にする必要があります。echo \\Smith
編集:しかし、より一般的には、「y」(「x」はバックスペースで保護されています)といくつかのバージョン(ダッシュ、zsh)を出力し、「x \ by」を出力します。をprintf
使用することの違いを確認することをお勧めします。echo x\\by
\b
echo
printf "%s\n" x\\by