私はUnixのechoコマンドについて読んでいて、\
-eオプションとバックスラッシュ()エスケープ文字について混乱していて、次の2つの例を実行しました。
echo "hello\\\\world"
出力:hello\\world
次に、-e を使用して同じコマンドを実行します。
echo -e "hello\\\\world"
出力:hello\world
それでは、オプションの有無にかかわらずバックスラッシュ文字の意味は何ですか-e
?
挨拶
ベストアンサー1
Bash二重引用符文字列では、バックスラッシュを使用して次の文字をリテラルとして扱うことができます。つまり、入力パラメーターは"a\\b"
以下を通過します。リテラル文字列 a\b
コマンドに。これから、どちらの場合も、最後のhello\\world
引数として渡すことがに渡さecho
れる前に、各バックスラッシュペアが単一のリテラルバックスラッシュに拡張されると結論付けることができますecho
。
「次のバックスラッシュエスケープ解析を有効にする」フラグを付けます-e
(詳細を参照)。単一のバックスラッシュのエスケープシーケンスとしてリストされているため、この場合、Bashは元の文字列に対して同じことを行い、2つのバックスラッシュを1つに減らします。このフラグは、主に水平タブや改行文字などのエスケープシーケンスを含めるために使用されます。たとえば、echo
help echo
\\
echo
-e
\t
\n
$ echo -e 'first\tsecond\tthird'
first second third
代わりにこれを使用することをお勧めしますprintf
。まず、フォーマット文字列を使用すると、ユーザーが提供した文字列をエスケープシーケンスと安全に混在させることができます。
$ printf '%s\t%s\t%s\n' 'inject\nescape' '\\' '\evil'
inject\nescape \\ \evil
第二に、すべてのバージョンがecho
それをサポートしているわけではなく、誤って引用されていない変数を使用すると、人々は動作を-e
変更できます。echo
$ injection='-e a\nb'
$ echo $injection
a
b
第三:本博士論文レベルの分析。
ところで、バッシュはそうですいいえ一重引用符で囲まれた文字列のバックスラッシュをエスケープ文字として扱うため、次の結果が表示されます。
$ echo 'hello\\\\world'
hello\\\\world
$ echo -e 'hello\\\\world'
hello\\world