ヒアドキュメント
複数行のテキストを処理する機能
例えば以下のような形
(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 || :)