#navi(../)
* シェルスクリプトのデバッグ方法 [#f5679487]
#contents
シェルスクリプトの動作状況を確認したい場合がありますよね。~
例えば意図した動作にならない場合にデバッグをしたい時などがあてはまると思います。~
本資料はbashを利用した場合のデバッグ方法(シェルの動作確認方法)を記します。
#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)
* 関連資料 [#t0a581d3]
-[[シェルスクリプトのデバッグ・実行する行と変数展開した行を同時表示する>逆引きシェルスクリプト/シェルスクリプトのデバッグ・実行行と変数展開行を同時表示する]]
* 動作説明用シェルスクリプトの説明 [#o9e3ad02]
#ref(debug.sh)
#!/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 が表示されます。~
また、foo, bar変数に実行したコマンド結果を格納しています。
ただし、引数が無い場合($1に何も設定されていない)は、''unary operator expected''が表示されてしまいます。~
&color(red){注意};~
文字列比較に==を利用しています。~
bashの場合は問題なく動作しますが、zshなどの場合はエラーとなります。~
==ではなく=を1つにしてください。
** 実行結果(debug.sh) [#wad15dbe]
上記シェルスクリプトに実行権限を付与し引数なしの場合と引数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オプションによりシェルスクリプトの動作状況がわかる [#ja0b391d]
bash -x シェルスクリプト名
上記の方法でシェルスクリプトの動作確認をすることができます。~
以下、引数なしの場合と引数sakuraの場合の動作結果を記します。
** 引数なし [#g35287a8]
bash -x debug.shで動作させた結果は以下の通りです。~
先頭に+がついています。~
if文の左辺に値が無いのがわかります。~
また、foo, bar変数にコマンドが返却した文字列が格納されているのがわかります。
$ 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) [#a62553cf]
bash -x debug.sh sakuraで動作させた結果は以下の通りです。~
if文の左辺に$1が設定されているのがわかります。~
foo, bar変数にコマンドが返却した文字列が格納されているのがわかります。
$ 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オプションを利用することによりバグを見つけやすくなると思います。
#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)