シェルスクリプトのデバッグ方法 †シェルスクリプトの動作状況を確認したい場合がありますよね。 関連資料 †動作説明用シェルスクリプトの説明 †#!/bin/bash if [ $1 == "sakura" ]; then echo "hello sakura" else echo "hello!" fi foo=`ls /etc/init.d/` bar=`LANG=C date` 上記スクリプトは引数としてsakuraを与えると hello sakura が表示され、それ以外の引数を与えると hello が表示されます。 注意 実行結果(debug.sh) †上記シェルスクリプトに実行権限を付与し引数なしの場合と引数sakuraを渡した場合の結果を以下に記します。 $ chmod +x debug.sh $ ./debug.sh ./debug.sh: line 3: [: ==: unary operator expected hello! $ ./debug.sh sakura hello sakura $1に何も存在しないので、if [ == "sakura" ]; then となりunary operator expectedが表示されています。 -xオプションによりシェルスクリプトの動作状況がわかる †bash -x シェルスクリプト名 上記の方法でシェルスクリプトの動作確認をすることができます。 引数なし †bash -x debug.shで動作させた結果は以下の通りです。 $ bash -x debug.sh + '[' == sakura ']' debug.sh: line 3: [: ==: unary operator expected + echo 'hello!' hello! ++ ls /etc/init.d/ + foo='NetworkManager acpid anacron atd auditd <省略> xfs xinetd ypbind yum-updatesd' ++ LANG=C ++ date + bar='Mon Nov 21 14:13:06 JST 2011' 引数あり(sakura) †bash -x debug.sh sakuraで動作させた結果は以下の通りです。 $ bash -x debug.sh sakura + '[' sakura == sakura ']' + echo 'hello sakura' hello sakura ++ ls /etc/init.d/ + foo='NetworkManager acpid anacron atd auditd <省略> xfs xinetd ypbind yum-updatesd' ++ LANG=C ++ date + bar='Mon Nov 21 14:16:09 JST 2011' シェルスクリプトのデバッグは-xオプションを利用することによりバグを見つけやすくなると思います。 |