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

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

私は読んでシェルスクリプトを学びようとしています。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(他のシェルでは効果はありません)。

答え2

使用する前に関数を定義する必要があります。

答え3

私はそれを自分で見つけたと思います。 Ubuntuがデフォルトとして使用されるという事実に閉じ込められているようです。 「sigh」dashコマンドを使用してスクリプトを実行しています。sh

答え4

いくつかの推測をしてみますが…vim気に入らないので、if(一度試してみてください。if (しかし、ただ楽しいことになるかもしれません。

私の考えでは、あなたの本当の問題は、あなたがrun_backupそれを作る前に電話をするということです。functionあなたのブロックの前にあなたのものを入れてくださいif then else。シェルは機能を使用する前に機能を理解する必要があります。これは通常プログラミングに適用されます。

関連情報