このエントリーをはてなブックマークに追加


シェルスクリプトのデバッグ方法

シェルスクリプトの動作状況を確認したい場合がありますよね。
例えば意図した動作にならない場合にデバッグをしたい時などがあてはまると思います。
本資料はbashを利用した場合のデバッグ方法(シェルの動作確認方法)を記します。


関連資料

動作説明用シェルスクリプトの説明

#!/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が表示されてしまいます。

注意
文字列比較に==を利用しています。
bashの場合は問題なく動作しますが、zshなどの場合はエラーとなります。
==ではなく=を1つにしてください。

実行結果(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 シェルスクリプト名

上記の方法でシェルスクリプトの動作確認をすることができます。
以下、引数なしの場合と引数sakuraの場合の動作結果を記します。

引数なし

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)

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オプションを利用することによりバグを見つけやすくなると思います。



添付ファイル: filedebug.sh 70件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:27:02