bash スクリプトを使用して 1 つまたは複数のタブ文字をエコーするにはどうすればよいですか? このコードを実行すると
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
私はこれを得る
res=[ x] # that is [<space>x]
echo -e ' \t '
「スペースタブスペース改行」をエコーします(-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
andを受け入れ--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.
文字列を二重引用符で囲みます。
echo "[$res]"
エコーに -e フラグを使用する必要があります。
echo -e "\t\t x"
bash の man ページから:
$'string' 形式の単語は特別に扱われます。単語は文字列に展開され、バックスラッシュでエスケープされた文字は ANSI C 標準の指定に従って置き換えられます。
だからあなたはこれを行うことができます:
echo $'hello\tworld'
逐語的なキーストローク^V
( CTRL+V
、C-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はリテラル文字を取得します。
スクリプトで使用する場合echo "a\tb"
は、スクリプトを次のように実行します。
# sh -e myscript.sh
または、myscript.sh に実行権限を与えてから、スクリプトを実行することもできます。
# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"