Bashスクリプトを使って1つ以上のタブ文字をエコーするにはどうすればいいですか?このコードを実行すると
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
私はこれを入手
res=[ x] # that is [<space>x]
echo -e ' \t '
'space tab space newline'をエコーします(-e
は 'バックスラッシュエスケープの解釈を有効にする'を意味します):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
printf
ではなくecho
を使用してください。
echo
コマンドには複数の異なるバージョンがあります。 /bin/echo
(システムによってはGNU Coreutilsバージョンである場合もそうでない場合もあります)があり、echo
コマンドはほとんどのシェルに組み込まれています。バージョンが異なれば、制御文字のエスケープを指定または無効にする方法が異なります(またはまったくありません)。
一方、printf
は、バリエーションがはるかに少ないです。これはコマンドとして存在することができ、通常は/bin/printf
であり、いくつかのシェルに組み込まれています(bashとzshにはありますが、tcshとkshにはありません)が、さまざまなバージョンはecho
の異なるバージョンよりはるかに似ています。コマンドラインオプションを覚えておく必要はありません(いくつかの例外はありますが、GNU Coreutils 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
実装または異なるShellでそれを実行すると、結果のコードは失敗する可能性があります。
文字列を二重の引用符で囲みます。
echo "[$res]"
あなたも試すことができます:
echo Hello$'\t'world.
エコーには-a flagを使う必要があります。
echo -e "\t\t x"
エコーを使用して変数の値を表示することは、一般的なBashの落とし穴です。参照リンク
Bashのmanページから:
$ 'string'形式の単語は特別に扱われます。 Wordは文字列に拡張され、バックスラッシュでエスケープされた文字はANSI C規格の指定に従って置き換えられます。
だからあなたはこれを行うことができます:
echo $'hello\tworld'
逐語的なキーストローク^V
(CTRL+V
、C-v
、 whatever )を使用してください。
端末に(またはほとんどのUNIXエディタで)^V
を入力すると、次の文字がそのまま使用されます逐語的な。これを使用して、エコーしている文字列内にリテラルタブ文字を入力できます。
次のようなものがあります。
echo "^V<tab>" # CTRL+V, TAB
Bashドキュメント (q.v.、 "quoted-insert")
quoted-insert(C-q、C-v)入力した次の文字を逐語的に追加します。これは、たとえばC-qのようなキーシーケンスを挿入する方法です。
副注:これによると、ALT+TAB
は同じことをするはずですが、そのシーケンスはすべてウィンドウの切り替えに限定されているので使用できません
tab-insert(M-TAB)タブ文字を挿入します。
-
注意:この戦略はあらゆる種類の変わった文字に対して使用できます。キャリッジリターンのように:
echo "^V^M" # CTRL+V, CTRL+M
これは、キャリッジリターンがASCII 13であり、Mがアルファベットの13番目の文字であるため、^M
を入力すると13番目の_が返されるためです。ASCII文字空のPromptでls^M
を使用して実際に動作しているのを確認できます。これにより、キャリッジリターンが挿入され、Promptはreturnキーを押すのと同じように動作します。これらの文字が通常解釈されるとき、逐語的なはあなたが文字通りの文字を得ることを得ます。
スクリプトでecho "a\tb"
を使用したい場合は、次のようにスクリプトを実行します。
# sh -e myscript.sh
あるいは、myscript.shに実行権限を与えてからスクリプトを実行することもできます。
# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"