\ tで始まる新しい行と文字列をエコーし​​ます。

\ tで始まる新しい行と文字列をエコーし​​ます。

もちろん、echo -eを使用すると、\ nが新しい行として認識されるようにすることができます。問題は、「\test」のように\tで始まるものをエコーし​​ようとしているときです。

私が公演したいとしましょうecho -e "test\n\\test"。私は出力を期待しています:

test
\test

しかし、代わりに出力は次のようになります。

test
  est

\\tリテラル\ tではなくタブ文字として解釈されます。この問題に対するクリーンな解決策はありますか?

答え1

echo -e "\\t"

バックスラッシュは二重引用符の中で特別なので渡され\tます。それは次のように作用するechobash逃げる(参照)演算子。では、\\自分で逃げます。

次のことができます。

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'

%becho(some s)と同じエスケープシーケンスを理解しますがecho、最初の引数printf(形式)もシーケンスを理解しますが、echo少し異なる方法で理解します(他の言語で実行される方法と似ています)。とにかく\n両側は理解する。

答え2

これはコマンドマニュアルに従わないが、man自体はポイント1を指摘している。

  1. エコーはシェルによって異なります(時々パイプなどを避けるべき他の理由があります)。
  2. Stéphaneのコメントは良い選択ですprintf
  3. 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"

関連情報