ウェブサイト検索

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


さまざまなデバッグ オプションとシェル スクリプト デバッグ モードを有効にする方法を説明することから、シェル スクリプト デバッグ シリーズを開始しました。

シェル スクリプトを作成した後、出力を見てスクリプトが正しく機能していることを確認するのではなく、実行する前にスクリプト内の構文を実際にチェックすることをお勧めします。

シリーズのこのパートでは、構文チェック デバッグ モードの使用方法を説明します。このシリーズの最初の部分でさまざまなデバッグ オプションについて説明したことを思い出してください。ここでは、それらを使用してスクリプトのデバッグを実行します。

詳細デバッグモードの有効化

このガイドの主な焦点に移る前に、冗長モードについて簡単に説明しましょう。これは、-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 が欠落していることがわかります。そして、シェルはファイルの終わりまでそれを探しましたが、見つからなかった場合(完了)、シェルは構文エラーを出力しました。

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

詳細モードと構文チェック モードを組み合わせることもできます。

bash -vn script.sh

あるいは、次の例のように上記のスクリプトの最初の行を変更することで、構文チェックを有効にすることもできます。

#!/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 シェル組み込みコマンドを使用して、上記のスクリプトでデバッグ モードを有効にすることができます。

以下の例では、スクリプト内の 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 

要約すると、シェル スクリプトを実行する前に、必ず構文をチェックしてエラーを捕捉する必要があります。

このガイドに関するご質問やフィードバックをお送りいただくには、以下の返信フォームをご利用ください。このシリーズの 3 番目のパートでは、シェル トレース デバッグ モードの説明と使用に移ります。