web-dev-qa-db-ja.com

bashスクリプトのエコータブ文字

Bashスクリプトを使って1つ以上のタブ文字をエコーするにはどうすればいいですか?このコードを実行すると

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

私はこれを入手

res=[ x] # that is [<space>x]
259
kalyanji
echo -e ' \t '

'space tab space newline'をエコーし​​ます(-eは 'バックスラッシュエスケープの解釈を有効にする'を意味します):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|
427
Johannes Weiss

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がタブを見る前に、シェルがタブをスペースに置き換えたのです。

echoecho hello worldのような単純な出力には問題ありませんが、もっと複雑なことをしたいときはいつでもprintfを使うべきです。 echoを動かすことができますことができますが、異なるecho実装または異なるShellでそれを実行すると、結果のコードは失敗する可能性があります。

66
Keith Thompson

文字列を二重の引用符で囲みます。

echo "[$res]"
32
kmkaplan

あなたも試すことができます:

echo Hello$'\t'world.
26
jbatista

エコーには-a flagを使う必要があります。

echo -e "\t\t x"
17
Learning

エコーを使用して変数の値を表示することは、一般的なBashの落とし穴です。参照リンク

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

11
Anonymous

Bashのmanページから:

$ 'string'形式の単語は特別に扱われます。 Wordは文字列に拡張され、バックスラッシュでエスケープされた文字はANSI C規格の指定に従って置き換えられます。

だからあなたはこれを行うことができます:

echo $'hello\tworld'
11
esoriano

逐語的なキーストローク^VCTRL+VC-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キーを押すのと同じように動作します。これらの文字が通常解釈されるとき、逐語的なはあなたが文字通りの文字を得ることを得ます。

8
rich remer

スクリプトでecho "a\tb"を使用したい場合は、次のようにスクリプトを実行します。

# sh -e myscript.sh

あるいは、myscript.shに実行権限を与えてからスクリプトを実行することもできます。

# chmod +x myscript.sh
# ./myscript.sh
2
ATC
res="\t\tx"
echo -e "[${res}]"
0
yanghaogn