#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)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS