シェルスクリプトのエラーメッセージ

シェルスクリプトのエラーメッセージ

私は読んでシェルスクリプトを学びようとしています。linuxcommand.org。何らかの理由ですべてのコマンドを実行しても、「見つかりません」エラーが発生し続けます。

私が受け取るエラーコードは次のとおりです。

minecraft_backup.sh: 21: run_backup: not found

minecraft_backup.sh: 23: function: not found

スクリプトは次のとおりです。

#!/bin/bash
#MineCraft backup script by

#Variables
APP=MineCraft
SERVICE=Minecraft_Mod.jar
APPDIR=/opt/MineCraft_Server/bin
BACKUPDIR1=/opt/MineCraft_Server/backup1
BACKUPDIR2=/opt/MineCraft_Server/backup2



#First i want to check if minecraft server is running.
if(ps ax | grep -v grep | grep $SERVICE > /dev/null)
then
    echo "$APP is running"
    $(run_backup)
else
    echo "$APP is not running"
    exit 1
fi

function run_backup
{
    echo "Starting back up"

    #create backup dirs of they do not exit
    if [ ! -d "$BACKUPDIR1" ]
    then
        mkdir $BACKUPDIR1
    fi

    if [ ! -d "$BACKUPDIR2" ]
    then
        mkdir $BACKUPDIR2
        echo "test"
    fi

    #backup save1 to save2
    rsync -av --delete "$BACKUPDIR1/" "$BACKUPDIR2"

    #backup running app to save 1
    rsync -av --delete "$APPDIR/" "$BACKUPDIR1"

}

ベストアンサー1

関数を定義する標準構造は次のとおりです。

run_backup () { … }

ksh、bash、zshではダッシュなどの他のシェルでは使用できませんが、次のように関数を定義できます。

function run_backup { … }

ダッシュを使用してスクリプトを実行すると、次のことが発生します。

  • シェルには$(run_backup)コマンドがないため、最初に最初のエラーメッセージを生成する行を自然に実行しますrun_backup
  • その後、シェルはコマンドを実行し、function run_backupコマンドが呼び出されなかったため、自然に2番目のエラーメッセージが表示されますfunction
  • その後、シェルは有効なシェル構文である中括弧ブロックを実行します。

xenoterracideの説明が示すように、スクリプトを実行したので、#!/bin/bash間違っていないとスクリプトが実行されます。bash

正しいシェルを使用してスクリプトを実行するか(私の提案)、function標準構文に変更しても(他の非標準構文は表示されません)、使用する前に関数定義を移動する必要があります。

より便利なヒント:シェルスクリプトをデバッグするときに実行bash -x /path/to/script(またはsh -x /path/to/script待機)してください。これにより、各実行行のトレースが印刷されます。スクリプトの一部のみを追跡するには、次を使用できます。set -xトレースを有効またはset +x無効にします。 Zshには他のものよりも優れたトレース機能がありますが、互換性のない構文があります。このコマンドを使用すると、zshにsh構文を期待するように指示できますemulate sh 2>/dev/null(他のシェルでは効果はありません)。

おすすめ記事