Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

シェルスクリプトで構文チェックのデバッグモードを実行する方法

シェルスクリプトのデバッグシリーズでは、これまでにさまざまなデバッグオプションの種類と、シェルスクリプトのデバッグモードを有効にする方法を解説してきました。

シェルスクリプトを書き終えたら、実行前に必ずスクリプトの構文を実際にチェックすることをおすすめします。出力結果を見て動作が正しいかどうかを確認するよりも、事前に構文エラーを検出する方が効率的だからです。

この記事では、構文チェック(シンタックスチェック)デバッグモードの使い方について詳しく見ていきます。前回の記事で説明した各種デバッグオプションを思い出しながら、実際にスクリプトのデバッグを行ってみましょう。

冗長(Verbose)デバッグモードの有効化

本題に入る前に、まずは冗長モード(verbose mode)について簡単におさらいしておきます。このモードは -v デバッグオプションで有効化され、シェルに対して「スクリプトの各行を読み込みながら表示する」よう指示します。

実際の動作を確認するために、PNG画像を一括でJPG形式に変換するサンプルシェルスクリプトを用意しました。

以下のコードをファイルに入力(またはコピー&ペースト)してください。

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

ファイルを保存したら、次のコマンドでスクリプトに実行権限を付与します。

$ chmod +x script.sh

そして、以下のようにスクリプトを実行すると、シェルが読み込んだすべての行が順番に表示されます。

$ bash -v script.sh

シェルスクリプトで構文チェックデバッグモードを有効にする

それでは本題です。-n オプションを使用すると、構文チェックモードが有効になります。このオプションを付けると、シェルはすべてのコマンドを読み込みますが、実行はせず、使用されている構文のみを検査します。

スクリプト内にエラーがある場合は、ターミナル上にエラーが出力されます。逆に問題がなければ、何も表示されません。

構文チェックを有効化するためのコマンド構文は以下のとおりです。

$ bash -n script.sh

先ほどのスクリプトは構文的に正しいため、上記コマンドを実行しても何も出力されません。そこで試しに、forループを閉じる done キーワードを削除して、エラーが表示されるかどうか確認してみましょう。

以下は、意図的にバグを含ませた、PNG画像をJPG形式へ一括変換する修正版スクリプトです。

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

ファイルを保存したら、構文チェックを行いながらスクリプトを実行します。

$ bash -n script.sh

上記の出力から、スクリプトに構文上の問題があることがわかります。forループに閉じる done キーワードが不足しているのです。シェルは done を探してファイルの末尾まで読み進めましたが、見つからなかったため、次のような構文エラーを出力しました。

script.sh: line 11: syntax error: unexpected end of file

冗長モードと構文チェックモードの併用

さらに、冗長モードと構文チェックモードを組み合わせて使うこともできます。

$ bash -vn script.sh

シバン(1行目)を書き換えて構文チェックを有効化する

別の方法として、スクリプトの1行目(シバン)を変更することでも構文チェックを有効化できます。次の例を見てください。

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

先ほどと同様にファイルを保存し、構文チェックを行いながらスクリプトを実行します。

$ ./script.sh

script.sh: line 12: syntax error: unexpected end of file

setビルトインコマンドを使ってデバッグを有効化する

また、シェルのビルトインコマンドである set を使って、スクリプト内でデバッグモードを有効化することも可能です。

以下の例では、スクリプト内のforループ部分のみ構文チェックを行っています。

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

ここでも同様に、ファイルを保存してスクリプトを実行してみてください。

$ ./script.sh 

set -n でデバッグを有効化し、set +n で無効化できる点がポイントです。この方法なら、スクリプトの特定の範囲だけを対象に構文チェックを行えます。

まとめ

シェルスクリプトは、実行前に必ず構文チェックを行い、エラーを事前に検出するようにしましょう。-n オプション、シバンへの記述、set コマンドのいずれかを使えば、簡単に構文チェックを実現できます。

本ガイドに関するご質問やフィードバックがあれば、下記のフォームからお気軽にお寄せください。シリーズ第3部では、シェルトレース(tracing)デバッグモードの使い方について解説していきます。

  1. Vimで新規シェルスクリプトに自動でカスタムヘッダーを挿入するテンプレート設定方法

    この記事では、Vimエディタで新しく作成するすべてのbashスクリプトに、カスタムヘッダーを自動的に挿入するための簡単な設定方法を紹介します。この設定を行うことで、vi/vimエディタで新しい .sh ファイルを開くたびに、カスタムヘッダーが自動的にファイルの先頭へ追加されるようになります。 bashスクリプト用カスタムヘッダーテンプレートファイルの作成方法 まずは、カスタムbashスクリプトヘッダーの内容を記述したテンプレートファイル sh_header.temp を作成します。ホームディレクトリ配下の ~/.vim/ ディレクトリなどに保存しておくと管理しやすいでしょう。 $ vi ~/.

  2. USBデバッグモードとは?Androidで有効にする方法をわかりやすく解説

    Androidユーザーが知っておくべき隠れた便利機能のひとつが「USBデバッグ」です。一般ユーザーにはあまり馴染みがないかもしれませんが、開発者にとっては欠かせない重要な機能です。まずは、USBデバッグの基本について詳しく見ていきましょう。 USBデバッグとは? アプリ開発者であれば、Androidスマートフォンの内部動作にアクセスし、高度なオプションを利用したいと考えるのは自然なことです。USBデバッグモードを有効にすると、USB接続を通じてこれらの操作が可能になり、Android SDK(Android Software Developer Kit)がインストールされたパソコンとの通信も行