Mensagem de erro do script Shell

3

Estou tentando aprender scripts de shell lendo linuxcommand.org . Por alguma razão, continuo recebendo o erro "Not Found", mesmo que ele execute todos os comandos.

Os códigos de erro que recebo são:

minecraft_backup.sh: 21: run_backup: not found

minecraft_backup.sh: 23: function: not found

Aqui está o script:

#!/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"

}
    
por ev00l 09.01.2011 / 06:55

4 respostas

7

A construção padrão para definir uma função é

run_backup () { … }

Em ksh, bash e zsh, mas não em outros shells, como dash, você pode definir uma função com

function run_backup { … }

O que aconteceu quando você executou o script com traço foi:

  • O shell executou a linha $(run_backup) , resultando naturalmente na primeira mensagem de erro, pois não havia nenhum comando chamado run_backup .
  • O shell executou posteriormente o function run_backup , resultando naturalmente na segunda mensagem de erro, pois não havia nenhum comando chamado function .
  • Em seguida, o shell executou o bloco de contraventamento, que por si só é uma sintaxe de shell válida.

Note que, como o comentário do xenoterracide indica, desde que você tenha #!/bin/bash , o script teria sido executado por bash se você não tivesse feito algo errado.

Mesmo se você executar o script com o shell correto ou (minha recomendação) alterar function para a sintaxe padrão (não vejo nenhuma outra construção não padrão), ainda será necessário mover a definição da função para antes de ser usado.

Mais uma dica útil: quando estiver depurando um script de shell, execute bash -x /path/to/script (ou sh -x /path/to/script , etc.). Isso imprime um traço de cada linha executada. Se você quiser rastrear apenas parte de um script, use set -x para ativar os rastreamentos e set +x para desativá-los. Zsh tem melhores traços que os outros, mas tem sintaxe incompatível; você pode dizer ao zsh para esperar a sintaxe sh com o comando emulate sh 2>/dev/null (que não tem efeito em outros shells).

    
por 09.01.2011 / 14:06
2

Suas funções precisam ser definidas antes de você usá-las.

    
por 09.01.2011 / 10:04
2

Acho que resolvi sozinho. Parece que me pertenço ao fato de que o Ubuntu usa dash como padrão, e eu estava executando o script usando o comando sh ... "suspiro"

    
por 09.01.2011 / 09:00
1

Eu vou fazer algumas suposições ... vim não gosta de if( , então tente if ( que pode ser apenas uma coisa vim.

Acho que seu verdadeiro problema é que você chama run_backup antes de criá-lo. coloque seu function antes do seu bloco if then else . o shell deve estar ciente das funções antes de poder usá-las. isso é verdade para programação em geral.

    
por 09.01.2011 / 07:39