16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェルの echo -e \b ってどういう時に使うんだ?

Last updated at Posted at 2015-05-08

CommandLine-Fuでなんだこれというのを見つけたので...

echo の \b

[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ファッ!?
プラス '+' が 80個ってどういうことよ。

解説

echoコマンドの -e は バックスラッシュでエスケープした文字を解釈させるオプション。
echoコマンドの -e \b は バックスペースの意味

DESCRIPTION
       -e     enable interpretation of backslash escapes
       \b     backspace

このバックスペースって何よ?っというのは、普通にバックスペースしているってこと。文字1つ削れるよ。

[dharry@frank ~]$ echo -e '123'
123
[dharry@frank ~]$ echo -e '12\b3'
13

で、なぜか、最後に\bを入れてもダメ。不思議。後ろにスペースを入れないといけない。

[dharry@frank ~]$ echo -e '12'
12
[dharry@frank ~]$ echo -e '12\b'
12
[dharry@frank ~]$ echo -e '12\b '
1

中身みると、バックスペース(0x08)入れてるっぽい。制御文字を出すようにcatするとC-Hが表示される。
なるほどねー。イメージとしては手で高速に入力して最後にバックスペースを入れてエンター押されているような感じだね。

[dharry@frank ~]$ echo -e '12\b' | hexdump -C
00000000  31 32 08 0a                                       |12..|
00000004
[dharry@frank ~]$ echo -e '12\b' | cat -v  hoge.txt
12^H

じゃあ、CommandLine-Fuのやつに戻って。
{1..80}はよく使うブレース展開 (brace expansion) ってやつですね。ホント便利。
ブレース展開の前後に文字つけてあげれば、それ付きで展開される。でも、通常のブレース展開だけだと、展開したものはスペースが入ってしまう。

[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[dharry@frank ~]$ echo {1..5}
1 2 3 4 5

[dharry@frank ~]$ echo {1..5}+
1+ 2+ 3+ 4+ 5+

[dharry@frank ~]$ echo hoge{1..5}
hoge1 hoge2 hoge3 hoge4 hoge5

じゃあ、\bでスペースを削ってあげればいいんだ...でもうまくいかない...
ああ、そうか、ブレース展開した文字の変数を作り、その変数をechoしてNullStringとして出力されればいいじゃん。

[dharry@frank]~% echo {1..5}'\b+'
+ + + + +
[dharry@frank]~% echo {1..5}'\b+ '
+  +  +  +  +

[dharry@frank ~]$ echo -e ''$_{1..5}'\b+'  | cat -v
^H+ ^H+ ^H+ ^H+ ^H+

[dharry@frank ~]$ echo -e ''$_{1..5}'\b+'
+++++

結論

というので、CommandLine-Fuのワンライナーは ブレース展開をNullStringで出力して、バックスペースで消していました。
$_{1..5} と アンダーバーを使っているけど、このアンダーバーは何でもよくて、代入されていない変数であればいいです。

[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+' | cat -v
^H+ ^H+ ^H+ ^H+ ^H+

[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+'
+++++

別のやつ

ここまで説明して最後にどうかと思いますが、あまりこの処理は好きじゃないです。
こっちの方が良いと思う。

[dharry@frank ~]$ zsh
[dharry@frank]~% repeat 80 echo -n '+'; echo
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[dharry@frank ~]$ seq  -s + 81 | sed "s/[0-9]//g"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[dharry@frank ~]$ echo "" |  awk '{ for(i=0;i<80;i++) printf("+"); print  }'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?