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