回答:
echo -e ' \t '
「スペースタブスペース改行」をエコーします(-e
「バックスラッシュエスケープの解釈を有効にする」を意味します):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
Makefileで機能しないのですか?
echo -e
は、がPOSIXではなく、通常はプログラムで使用されないmake
呼び出し/bin/sh
がインタラクティブに使用-e
され、通常は実装されていないためです。移植性のためprintf '\t'
に、代わりに使用してください。
man
、echo
コマンドのページにオプションが記載されていません-e
。ただし、このオプションは受け入れられます。
printf
ではなくを使用してくださいecho
。
echo
コマンドには複数の異なるバージョンがあります。あります/bin/echo
(またはシステムに応じて、GNUのCoreutilsバージョンであってもなくてもよい)、およびecho
コマンドはほとんどのシェルに組み込まれています。バージョンによって、制御文字のエスケープを指定または無効にする方法が異なります(または方法がありません)。
printf
一方、変動ははるかに少なくなります。これは通常/bin/printf
、コマンドとして存在することができ、一部のシェルに組み込まれています(bashとzshにはありますが、tcshとkshにはありません)echo
。また、コマンドラインオプションを覚えておく必要はありません(いくつかの例外があります。GNUCoreutils printfは--version
およびを受け入れ--help
、組み込みのbash printfは-v var
出力を変数に格納することを受け入れます)。
あなたの例のために:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
そして今、私がecho
あなたが尋ねている例と同じように機能することを認める時が来ました。引数を二重引用符で囲むだけです:
echo "[$res]"
kmkaplanが書いたように(2年半前、私は気づきました!)。元のコマンドの問題:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
とは異なりecho
ます。それは、シェルがecho
これまで見たことのないスペースでタブを置き換えたことです。
echo
のような単純な出力には問題ありませんが、もっと複雑なことをしたいときはいつでもecho hello world
使用する必要がありますprintf
。あなたはでき得るecho
仕事に、しかし、結果のコードは、あなたが異なるとそれを実行すると失敗する可能性がありecho
、実装または別のシェル。
あなたも試すことができます:
echo Hello$'\t'world.
、そのままキーストロークを使用し^V
(CTRL+V
、C-v
、何でも)。
あなたが入力すると^V
(またはほとんどのUnixのエディタで)端子に、以下の文字が取られ逐語的に。これを使用して、エコーする文字列内にリテラルタブ文字を入力できます。
次のようなもの:
echo "^V<tab>" # CTRL+V, TAB
Bash docs(qv、 "quoted-insert")
quoted-insert(Cq、Cv)入力した次の文字をそのまま行に追加します。これは、Cqなどのキーシーケンスを挿入する方法です。
補足:これに従って ALT+TAB
、同じことを行う必要がありますが、そのシーケンスはすべてウィンドウ切り替えにバインドしているため、使用できません。
tab-insert(M-TAB)タブ文字を挿入します。
-
注:この戦略は、あらゆる種類の変わった文字で使用できます。キャリッジリターンのように:
echo "^V^M" # CTRL+V, CTRL+M
これは、キャリッジリターンがASCII 13であり、Mがアルファベットの13番目の文字であるため、と入力^M
すると、13番目のASCII文字が返されます。ls^M
空のプロンプトで、を使用して動作を確認できます。これにより、改行が挿入され、Enterキーを押すのと同じようにプロンプトが機能します。これらの文字が正常に解釈されると、逐語的にリテラル文字を取得します。
grep
を含む行をキャッチするために使用するときに私の日を節約しましたtab
。
エコーを使用して変数の値を出力することは、一般的なBashの落とし穴です。参照リンク: