連続したスペースとprintf
ある個数分の連続したスペースを使用したければスペースをループで結合して使用するなどは行わない方がいい。printf
を使用する方が簡潔に書ける。
$ count=30
$ sp=''
$ for i in `seq 1 $count`
> do
> sp="$sp "
> done
$ echo "f${sp}t"
f t
上のコードは1行で書ける。
$ sp=`printf "%${count}s"`
$ echo "f${sp}t"
f t
連続したスペースとダブルクォーテーション
ちなみにスペースを含む変数は、ダブルクォーテーションで括らないと、echoしたときに連続するスペースが消されてしまう。
$ echo f${sp}t
f t
もしスペース始まりであれば、先行するスペースはすべて消える。
$ echo ${sp}t
t
連続したスペースとprintfの応用
printf
は標準出力を整形して出力することが目的なので、sed
と組み合わせて、テンプレートファイルのきれいな編集などにも使える。
たとえば、次のようなテンプレートファイルがあり、%TITLE%を置き換えたうえで、末尾の##を他の行と揃えたいとする。
######################################################################
## %TITLE%##
######################################################################
#が70文字分あり、文頭の'## 'と文末の'##'の5文字分以外をTITLEとスペースで埋めればいいので、printf %-65s "$title"
となる。-65s
と-
がついているのは左揃えにしたいから。printf %65s "$title"
だと右揃えになってしまう。
$ title='text the length of which is not determined before command is executed.'
$ title=`echo $title | head -c $(($RANDOM % 50))`
$ sed -e "s/%TITLE%##/`printf %-65s \"$title\"`##/" template.txt
######################################################################
## text the length of whic ##
######################################################################