shは二重引用符の中のバックスラッシュをどのように解釈しますか?

shは二重引用符の中のバックスラッシュをどのように解釈しますか?

shDebian への接続dash次のコマンドは、2 つの空行を生成します。

sh -c 'echo "\n"'

なぜ2つの空行があるのですか?なぜ一つもないのですか?なぜ\n説明しますか?

ただし、busyboxでは、sh同じコマンドを実行すると次の行が生成されます。

\n

shさまざまなプラットフォームでバックスラッシュ処理が均一ですか?バックスラッシュを処理する必要があるという標準はありますか?

答え1

as引数で呼び出されると、POSIX + XSI準拠のecho実装は改行に\n拡張する必要があるため、2つの改行を出力します。これに関して、あなたの組み込み機能は互換性があるようです。\nechosh

POSIXでは出力が必要ですが、他のecho実装ではこれを達成するためのオプションが必要です。 (これは動作が指定されていないPOSIX仕様の将来のバージョンで変更される予定です(XSIオプションを実装するシステムを除く)。-eecho -e-e

このような理由などを避けてecho使用するのが最善ですprintf。バラよりなぜprintfがechoより優れているのですか?もっと学ぶ。

とにかく、すべてのBourne様シェルで二重引用符内の\唯一の文字は\、および文字(特別な意味が削除される)と改行文字$(これを削除させる)です。"`\<NL>続ける)、いいえn。だから:

echo '\n'
echo "\n"
echo \\n
echo $'\\n'

これは2文字の文字列であり、\渡さnれますecho(少なくともコードが`...`最後の2文字以内にない場合)。

1 つの改行文字で構成される文字列を渡すには、次のものが必要です。

echo $'\n'

これは現在、Bourneに似た他の多くのシェルでサポートされているksh93構文です。移植性(Bourneに似たシェル):

echo '
'
echo "
"

これをしたいかもしれませんが:

# at the top of the script:
NL='
'
# or (with the Bourne shell, use `...` instead):
eval "$(printf 'NL="\n" CR="\r" TAB="\t"')"

# and then:
echo "$NL"

読みやすさを向上させます。

Bourneに似たシェルではない場合、状況は異なります。バラより通常の文字のように特殊文字を使用する方法は?詳細。

関連情報