かべぎわブログ

技術的なことについてかけたらいいな…

シェルスクリプトのデバッグ時に使えるbashのオプション5選

シェルスクリプトデバッグしていてよく使うオプションを5つ紹介します!

/bin/bash -e ./script.sh

シェルスクリプトの中でエラー(終了ステータスが0以外)が発生した場合、そこでスクリプトを終了します。
ただし、自分の意図と反して終了することもあるので注意が必要。
(diffで差分があったときの終了ステータスが1だと知らず結構ハマりました。)

実行例

スクリプトの内容

#!/bin/bash
diff foo.txt bar.txt
echo "wawawa"

結果

kabegiwa$ /bin/bash -e ./script.sh
1c1
< foo
---
> bar

最後のecho "wawawa"が実行されていないことがわかる

/bin/bash -u ./script.sh

定義されていない変数が使われた際にそこでエラー終了とするオプションです。
たとえば以下のようなスクリプトを実行した時にrm -rf /が発行されるのを防いでくれます。

実行例

スクリプトの内容

path=wawawa/tmp
rm -rf /${pasu}

結果

kabegiwa$ /bin/bash -u ./script.sh
./script.sh: 行 3: pasu: 未割り当ての変数です

/bin/bash -x ./script.sh

シェルスクリプトで実行した結果を変数の仲間で含めてすべて標準出力してくれます。

実行例

スクリプトの内容

foo=wawawa
bar=sasasa

echo ${foo}
echo ${bar}

結果

kabegiwa$ /bin/bash -x ./script.sh
+ foo=wawawa
+ bar=sasasa
+ echo wawawa
wawawa
+ echo sasasa
sasasa

/bin/bash -v ./script.sh

これもデバッグで利用できるものですが、/bin/bash -xオプションとは違い、変数をそのまま変数名で表示してくれます。

実行例

スクリプトの内容

foo=wawawa
bar=sasasa

echo ${foo}
echo ${bar}

/bin/bash -xスクリプトの内容は同じ

結果

kabegiwa$ /bin/bash -x ./script.sh
#!/bin/bash
foo=wawawa
bar=sasasa

echo ${foo}
wawawa
echo ${bar}
sasasa

/bin/bash -n ./script.sh

実際にシェルスクリプトを実行することなく文法チェックをすることができます。

実行例

結果(文法に問題がない場合)

kabegiwa$ /bin/bash -n ./script.sh
kabegiwa$

なにも出力されない

結果(文法に問題がある場合)

kabegiwa$ /bin/bash -n ./script.sh
script.sh: 行 6: 予期しないトークン `fi' 周辺に構文エラーがあります
script.sh: 行 6: `fi'