私は読んでシェルスクリプトを学びようとしています。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
。シェルは機能を使用する前に機能を理解する必要があります。これは通常プログラミングに適用されます。