スラッシュやその他の特殊文字を含む複数行の文字列を出力する方法は?

スラッシュやその他の特殊文字を含む複数行の文字列を出力する方法は?

bashスクリプトの完了後に出力したいです。

 /\_/\
( o.o )
 > ^ <

以下を試しましたが、すべてエラーを返しました。

echo /\\_/\\\n\( o.o \)\n > ^ <
echo  \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <

bashがその文字を文字列としてレンダリングするようにこの文字をエスケープするにはどうすればよいですか?

答え1

catこの場合、ここで(引用された)文書を使用します。

cat <<'END_CAT'
 /\_/\
( o.o )
 > ^ <
END_CAT

これは、シェルの「妨害」(変数の拡張など、バックスラッシュのエスケープシーケンスの解釈やリダイレクト、パイピングなど)なしで、ASCIIアートを期待どおりに出力するのに最適な方法です。

複数行の文字列を使用することもできますprintf

printf '%s\n' ' /\_/\
( o.o )
 > ^ <'

出力したい静的文字列の周りに一重引用符を使用することに注意してください。 ASCII文字がシェルによって何らかの方法で解釈されないように、単一引用符を使用します。また、私たちが出力する文字列は次のようになります。第二引数printf最初の引数printfは、常にバックスラッシュが無効になっていない一重引用符形式の文字列です。

または複数の文字列printf(1行に1つずつ):

printf '%s\n' ' /\_/\' '( o.o )' ' > ^ <'
printf '%s\n' \
' /\_/\' \
'( o.o )' \
' > ^ <'

またはecho(しかし参照なぜprintfがechoより優れているのですか?;デフォルトでは、シェルと現在の設定によっては、ASCII描画をうまく処理できない特定のエスケープシーケンスに問題がある可能性があります。

echo ' /\_/\
( o.o )
 > ^ <'

しかし、もう一度言うが、ここで文書化するのがcat最も便利で簡単だと思います。

答え2

''演算子として扱われ""ないように、一重引用符または二重引用符で囲みます。<>()その後、1行に表示するには、Bashでまたはをecho -e使用して$' '改行を表示し、\n別のバックスラッシュでバックスラッシュをエスケープします。または、むしろ、printf異なる環境間の違いの問題を避けるためです。echo

だから:

$ printf ' /\\_/\\\n( o.o )\n > ^ <\n'
 /\_/\
( o.o )
 > ^ <
$ printf "%s\n" $' /\\_/\\\n( o.o )\n > ^ <'
 /\_/\
( o.o )
 > ^ <  

また見なさい:

関連情報