シェルスクリプトで連続スペースが入った文字列を出力したい場合、そのまま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
以上、自分用メモメモ。
コメント