もちろん、echo -eを使用すると、\ nが新しい行として認識されるようにすることができます。問題は、「\test」のように\tで始まるものをエコーしようとしているときです。
私が公演したいとしましょうecho -e "test\n\\test"
。私は出力を期待しています:
test \test
しかし、代わりに出力は次のようになります。
test est
\\t
リテラル\ tではなくタブ文字として解釈されます。この問題に対するクリーンな解決策はありますか?
答え1
echo -e "\\t"
バックスラッシュは二重引用符の中で特別なので渡され\t
ます。それは次のように作用するecho
bash
逃げる(参照)演算子。では、\\
自分で逃げます。
次のことができます。
echo -e "\\\\t"
forecho
が渡されるか\\t
(それも機能します)、特別でないecho -e "\\\t"
一重引用符を使用できます。\
echo -e '\t'
今、echo
移植性が非常に低いコマンドです。でもbash
環境によって動作が異なる場合があります。私はそれを避け、代わりに使用することをお勧めしますprintf
。次のようにできます。
printf 'test\n\\test\n'
あるいは、どの部分がそのようなエスケープシーケンス拡張を受けるかを決定することもできる。
printf 'test\n%s\n' '\test'
または:
printf '%b%s\n' 'test\n' '\test'
%b
echo
(some s)と同じエスケープシーケンスを理解しますがecho
、最初の引数printf
(形式)もシーケンスを理解しますが、echo
少し異なる方法で理解します(他の言語で実行される方法と似ています)。とにかく\n
両側は理解する。
答え2
これはコマンドマニュアルに従わないが、man自体はポイント1を指摘している。
- エコーはシェルによって異なります(時々パイプなどを避けるべき他の理由があります)。
- Stéphaneのコメントは良い選択です
printf
。 echo
回避策echo -e "a\na\ta"
(二重引用符、より多くの情報を得るためにこのコードを拡張するには、その内容を読んでください)とテスト:
`
➜ ~ echo -e a \n a \ta
a n a ta
➜ ~ echo -e "a \n a \ta"
a
a a
➜ ~ echo -e "a\na\ta"
a
a a
➜ ~ bash
T420s:~$ echo -e "a\na\ta"
a
a a
T420s:~$ echo -e a\na\ta
anata
T420s:~$ echo a\na\ta
anata
T420s:~$ echo "a\na\ta"
a\na\ta
T420s:~$
最初のシェルはZSHです。
答え3
二重引用符内のバックスラッシュは、次の文字を文字通り解釈し(次の文字がその文字の1つである場合)、シェルの断片を文字列"test\n\\test"
に展開します。それ以外の場合、バックスラッシュ自体は文字通り解釈されます。次に、改行とタブに置き換えます。test\n\test
"$\`
echo -e
\n
\t
リテラルテキストを引用するために二重引用符を使用しないでください。代わりに一重引用符を使用してください。ルールはより簡単です。一重引用符内のすべての内容は、文字通り一重引用符として解釈されます。二重引用符を使用することを選択した場合は、後に引用符で囲む文字のないバックスラッシュを使用しないでください。二重引用符でバックスラッシュを使用するには、バックスラッシュを使用します\\
。
echo -e 'test\n\\test'
echo -e "test\\n\\\\test"