G-Tune

[Shell] 文字列の連続スペースを出力する

シェルスクリプトで連続スペースが入った文字列を出力したい場合、そのままechoするとスペースが詰められてしまう。

例えば、以下のようなスクリプトをmeminfo.shというファイル名で作成した場合。

#!/bin/bash
cat /proc/meminfo | while read line
do
    echo $line
done

# ./meminfo.sh
MemTotal: 1937284 kB
MemFree: 150576 kB
Buffers: 91752 kB
Cached: 901904 kB
SwapCached: 3236 kB
     :
     :
     :

連続したスペースもきちんと表示させたい場合は、変数をダブルクォーテーションで括る必要がある。

#!/bin/bash
cat /proc/meminfo | while read line
do
    echo "$line"
done

# ./meminfo.sh
MemTotal:        1937284 kB
MemFree:          150584 kB
Buffers:           91832 kB
Cached:           901904 kB
SwapCached:         3236 kB
     :
     :
     :

ちなみに、文字列の前後にあるスペースは、ダブルクォーテーションで括らないと全てなくなってしまう。PHPやSQLなどのtrim関数と同じような動き。

# aaa="      00      "
# echo $aaa
00
# echo "$aaa"
      00
# echo -n $aaa | wc -m
2
# echo -n "$aaa" | wc -m
14

ただし、文字数のカウントを${#変数名}で行う場合はtrimされない。

# echo ${#aaa}
14

この挙動はcshでも同じ。以下のスクリプトをcshtest.shとして作成。

#!/bin/csh
set aaa="      00      "
echo $aaa
echo "$aaa"
echo -n $aaa | wc -m
echo -n "$aaa" | wc -m

# ./cshtest.sh
00
      00
2
14

以上、自分用メモメモ。