スクリプトメモ
bash コマンドは日経Linux のコマンド一覧に
載っていないので検索
http://kazmax.zpp.jp/cmd/b/bash.1.html
によれば
1 | bash -e |
で
コマンドが0以外の終了ステータス
つまりエラーがあれば終了するようになる
これは処理の最後に
1 | rm -Rf “./$ dir ” |
として
$dir がからのままここに来ないようにする
ただし -e オプションは途中で以上終了しても
止まってくれない
1 2 3 4 5 6 7 8 9 | #!/bin/bash false | true echo "止まらない" true | false echo “止まる" |
というファイルを実行すれば結果がわかる
1 2 | 止まらない 止まる |
というように結果として止まらない
なので bash -e を信用しないこと
PIPESTATE などで判断するといい
次に exec コマンド
【 exec 】 現行のジョブに置き換えてコマンドを続行する
を参考にするといい
これは標準エラーを捨てるのにも使われる
1 | exec 2> /dev/null |
とすれば /dev/null
に出力され消えることになる
主な書式は
exec2 > file
とすれば
以後のシェルスクリプトのエラー出力を
file に書き出す
というようになる
書籍にある
1 | exec2 > ./$( basename $0).$( date + %Y%m%d%H%M%S).log |
とすれば
実行ファイル名.日付.log
というファイル名になる
bash のオプションに
xvとあるけど
どっちもログを標準エラー出力にする
違いは
bash – コマンド (プログラム) の説明 – Linux コマンド集 一覧表
を参考に
$(basename $0)
はシェルスクリプトの名前
試しに
1 | vim test . bash |
で作成
1 2 3 4 5 6 7 | #!/bin/bash basename "$0" echo $0 |
実行するとわかるけど
echo との違いはパスを含まず
ファイル名だけ表示されること
結果は
1 2 3 | test . bash /home/vagrant/test . bash |
というようになる
判定で、それぞれ変数dir に日付が入っているか
そして
本日付の圧縮ファイルがあるかを調べるのが
1 2 3 | dir = "$(date +%Y%m%d)" [ ! -e "$ dir . tar .gz” ] |
の部分
-gt はシェルスクリプトの比較演算子
-e もおなじ
を参考にソースを読むことに
-e の意味は、ファイルが存在するなら
という意味
-gt は〜より大きいという意味
英語の greater than の略
-gt については
を参考にしました
!は条件の反転になるので
! -e ならファイルが存在しないのならという意味に
なお
[Sh]簡素なif文は一行で書く[Sh]簡素なif文は一行で書く
でわかったのですが
シェルスクリプトの場合1文で書くときには
if を省けるようです
このため、今回の [] の中身は if の判定でした
このため
1 | [ "$dir" -gt "20140101” ] |
は日付が 20140101 より大きいのなら
という判定になり
1 | [ ! -e "$ dir . tar .gz” ] |
は
日付.tar.gz というファイルが存在しないのなら
という判定になります