ヒアドキュメント
複数行のテキストを処理する機能
例えば以下のような形
(EOL
の部分は任意。他にEOS
やEOF
などもよく使われる)
cat << EOL >> temp.txt
line1
line2
line3
EOL
これを使うとwhile文やfor文、変数への代入が楽になったりする。
cat << EOL | while read r
repository1
repository2
repository3
EOL
do
echo ${r}
done
for r in $(cat << EOL
repository1
repository2
repository3
EOL
);
do
echo === ${r} ===
git -C ${r} status -sb
done
repositories=$(cat << EOL
repository1
repository2
repository3
EOL
)
参考リンク
変数の展開
変数が定義されていない時だけ設定したい、みたいなデフォルト引数的な処理などに使える。
具体例
value=${1:-"empty"}
とすると、引数が空だとempty
が設定されるし引数が渡されたらその引数が入っている。
: ${TOOL_PATH:="/bin"}
とすると、変数(主に環境変数)が設定されていたらそれを使うし、そうでなければ/bin
を代入する。
TIPS:ここの
:
は何もしない命令で、単に${TOOL_PATH:=}
とすると${TOOL_PATH}
に設定されている値か、空であれば/bin
がコマンドと解釈されてしまう。
参考リンク
-
http://kodama.fubuki.info/wiki/wiki.cgi/bash/tips?lang=jp#20
- 他にも置換などの便利機能があるので読んでみると面白いかと。
エラーや未定義変数操作時に処理を止める
bash
コマンドの引数で解決する。
-
-e
: エラー発生時に止める -
-u
: 未定義変数参照時にエラーにする
実行コマンドをログに表示するための-x
とともに、bash -eux script.sh
というように使われることが多い。
よくあるのがファイルの先頭に書く呼び出しコマンドのところに引数を与えること。
#!/bin/bash -eux
errorcommand
TIPS: 先頭行で
/bin/bash
と書く部分はシェルに限らずどのコマンドでも指定できる。python
とかphp
とか。
エラーをもみ消す
例えばキャッシュを削除するような処理で単にrm cache
と呼び出すケースにおいて、cache
が存在しなければエラーになる。
単にエラーになるならNo such file or directory
と怒られるだけだが、bash -e
と呼び出していた場合ではそこで処理が止まってしまう。
それを避けるために何もしないコマンド:
に||
(前のコマンドが失敗したら次のコマンドを呼び出す)でつなげることでエラーをもみ消すことができる。
上のケースではrm cache || :
と書く。(エラー出力ももみ消すならrm cache 2>/dev/null || :
)