388

bash スクリプトを使用して 1 つまたは複数のタブ文字をエコーするにはどうすればよいですか? このコードを実行すると

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

私はこれを得る

res=[ x] # that is [<space>x]
4

10 に答える 10

641
echo -e ' \t '

「スペースタブスペース改行」をエコーし​​ます(-e「バックスラッシュエスケープの解釈を有効にする」ことを意味します):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|
于 2009-02-08T15:08:03.160 に答える
88

printfではなく、使用してくださいecho

コマンドには複数の異なるバージョンがありますecho/bin/echo(システムによっては、GNU Coreutils のバージョンである場合とそうでない場合があります) があり、コマンドechoはほとんどのシェルに組み込まれています。異なるバージョンでは、制御文字のエスケープを指定または無効にする方法が異なります (または方法がありません)。

printf一方、変動ははるかに少ないです。通常はコマンドとして存在でき、/bin/printf一部のシェルには組み込まれています (bash と zsh にはありますが、tcsh と ksh にはありません) echo。また、コマンド ライン オプションを覚えておく必要もありません (いくつかの例外があります。GNU Coreutils の printf は--versionandを受け入れ--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ますが、別の実装または別のシェルで実行すると、結果のコードが失敗する可能性があります。echoecho

于 2011-11-17T01:59:09.597 に答える
57

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

echo Hello$'\t'world.
于 2009-12-10T23:07:53.937 に答える
36

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

echo "[$res]"
于 2009-02-08T15:10:12.937 に答える
24

エコーに -e フラグを使用する必要があります。

echo -e "\t\t x"
于 2009-02-08T15:10:12.873 に答える
24

bash の man ページから:

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

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

echo $'hello\tworld'
于 2015-12-02T10:43:41.190 に答える
18

逐語的なキーストローク^V( CTRL+VC-v何でも) を使用します。

^V端末 (またはほとんどの Unix エディター) に入力すると、次の文字はverbatimと見なされます。これを使用して、エコーする文字列内にリテラル タブ文字を入力できます。

次のようなものが機能します。

echo "^V<tab>"     # CTRL+V, TAB

Bash ドキュメント( qv、「quoted-insert」)

quoted-insert (Cq, Cv) 入力した次の文字をそのまま行に追加します。これは、たとえば Cq のようなキー シーケンスを挿入する方法です。

補足: this によると ALT+TAB 、同じことを行う必要がありますが、そのシーケンスをウィンドウの切り替えにバインドしているため、使用できません

tab-insert (M-TAB) タブ文字を挿入します。

--

注: この戦略は、あらゆる種類の特殊なキャラクターで使用できます。キャリッジ リターンのように:

echo "^V^M"        # CTRL+V, CTRL+M

これは、キャリッジ リターンが ASCII 13 であり、Mがアルファベットの 13 番目の文字であるためです^M。空のプロンプトで , を使用ls^Mすると、キャリッジ リターンが挿入され、リターンを押したときと同じようにプロンプ​​トが動作します。これらの文字が通常解釈される場合、verbatimはリテラル文字を取得します。

于 2016-05-06T02:48:37.140 に答える
2

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

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh
于 2011-11-16T23:32:15.397 に答える
0
res="\t\tx"
echo -e "[${res}]"
于 2016-02-15T12:44:25.600 に答える