動機
$ echomultiline
hoge
fuga
- こんな関数を書きたいとする。
- 主にシェルスクリプトのhelpを表示する関数。
- 普通にスペースでインデントすると、出力にスペースが入ってしまう。
echomultiline () {
echo "hoge
fuga"
}
$ echomultiline
hoge
fuga
- ヒアドキュメントで書くと、(タブ文字でしか)インデントできない。
echomultiline () {
cat << _EOB_
hoge
fuga
_EOB_
}
# タブ文字でインデント
echomultiline () {
cat <<-_EOB_
hoge
fuga
_EOB_
}
- 普段通りスペースで、きれいにインデントしたい。
- 結論先出しすると、決定版と言えるものはない。
複数回echo
echomultiline () {
echo "hoge"
echo "fuga"
}
- 単純明快。
-
echo <text> 1>&2
とかしたいとき大変。
{}
か()
で括る
echomultiline () {
{
echo hoge
echo fuga
} 1>&2
}
一行で記述してtrコマンドで改行に置換
echomultiline () {
echo "hoge@fuga" | tr '@' '\n'
}
- 全体の可読性は上がるが、この部分は見づらい。
sedコマンドで余分なものを削除
echomultiline () {
echo "hoge
fuga" | sed 's/^ *//g'
}
echomultiline () {
echo "
hoge
fuga
" | sed -e 's/^ *//g' -e '1d' -e '$d'
}
- やりすぎ感。
別解:whatコマンドを使用
- 実行可能ファイル形式シェルスクリプトの説明文限定。
sample.sh
# !/bin/bash
# @(#)hoge
# @(#)fuga
what $0
$ what sample.sh
sample.sh
hoge
fuga
$ ./sample.sh
sample.sh
hoge
fuga
- わりときれいに書ける。