Erro no script Bucket Brigade estou executando

2

O comando brig start n deve criar uma brigada de bucket de n processos do passer no script do passer, mas quando executo esse script para iniciar o processo, estou recebendo o seguinte erro:

./brig: line 121: syntax error near unexpected token 'else'
./brig: line 121: 'else'

Abaixo está o script: Obrigado por qualquer ajuda que você possa dar!:

#!/bin/bash

#bucket brigade - brigade script
#the user defines a fire
#the user defines number of passers
#then passers extinguish the fire

if [[ "" = *[!0-9]* ]];
then
echo "The second argument may only contain digits"
exit
fi
# must be empty or contain only digits
#to pass this point

case "" in

fire)
if [ -z "" ];
then
echo Please provide a fire size
echo 'exe: brig fire 10'
else
echo "" > .fire.size
echo "A fire of  intensity has started"
fi
;;

alarm)

rm .report.pas.* 2> /dev/null

if [ -z "" ];
then
echo Please provide the number of passers
echo 'exe: brig alarm 5'

elif [ "" -lt 2 ];
then
echo "There needs to be more than one passer"

else

passvar=""
export totalpass=""
#passers check exported variable to see if they
#are high number

touch .keep.passing

echo "$totalpass Passers have been activated"
while [ "$passvar" -gt 0 ];
do

bash passer "$passvar" &
((passvar--))
done
fi
;;

status)

firenow=0

clear
echo "Report of situation as of"
echo $(date)

if  [ -e .fire.size ];
then
firenow=$(cat .fire.size)
fi

if [ "$firenow" -gt 0 ];
then
echo "The fire is blazing with $firenow intensity"
else
echo "No fire is active"
fi

if [ -e .keep.passing ];
then

touch .passers.pause
sleep 3

ls | grep bucket. > .current.buckets
cat bucket.* > .bucket.contents

echo "The current active buckets and contents:"
paste .current.buckets .bucket.contents | tr '\t' '\n'

rm .current.buckets
rm .bucket.contents
rm .passers.pause

else

echo "There are no buckets currently active"

fi

;;

quit)
rm .keep.passing 2> /dev/null
sleep 1
rm .fire.size 2> /dev/null
rm bucket.* 2> /dev/null

if [ -e .report.pas.1 ];
then
cat .report.pas.* >> .unified.report
fi

clear
echo 'Generating Report for this session'
sleep 3
cat .unified.report | more
else
echo "No reports exist at this time"
fi
;;

*)
echo 'Usage: brig [fire (n)|alarm (n)|status|report|quit]'
esac
    
por HankG 24.03.2015 / 21:13

1 resposta

3

Existe um fi que não deveria existir na linha 114. O código correto seria este:

#!/bin/bash

# Bucket brigade - brigade script
# The user defines a fire
# The user defines number of passers
# Then passers extinguish the fire

if [[ "" = *[!0-9]* ]]; then
    echo "The second argument may only contain digits"
    exit
fi

#  must be empty or contain only digits to pass this point

case "" in

    fire)
        if [ -z "" ]; then
            echo Please provide a fire size
            echo 'exe: brig fire 10'
        else
            echo "" > .fire.size
            echo "A fire of  intensity has started"
        fi
    ;;

    alarm)

        rm .report.pas.* 2> /dev/null

        if [ -z "" ]; then
            echo Please provide the number of passers
            echo 'exe: brig alarm 5'
        elif [ "" -lt 2 ]; then
            echo "There needs to be more than one passer"  
        else

            passvar=""
            export totalpass=""
            #passers check exported variable to see if they are high number
            touch .keep.passing
            echo "$totalpass Passers have been activated"
            while [ "$passvar" -gt 0 ]; do

                bash passer "$passvar" &
                ((passvar--))
            done
        fi
    ;;

    status)

        firenow=0

        clear
        echo "Report of situation as of"
        echo $(date)

        if  [ -e .fire.size ]; then
            firenow=$(cat .fire.size)
        fi

        if [ "$firenow" -gt 0 ]; then
            echo "The fire is blazing with $firenow intensity"
        else
            echo "No fire is active"
        fi

        if [ -e .keep.passing ]; then

            touch .passers.pause
            sleep 3

            ls | grep bucket. > .current.buckets
            cat bucket.* > .bucket.contents

            echo "The current active buckets and contents:"
            paste .current.buckets .bucket.contents | tr '\t' '\n'

            rm .current.buckets
            rm .bucket.contents
            rm .passers.pause

        else
            echo "There are no buckets currently active"
        fi

    ;;

    quit)
        rm .keep.passing 2> /dev/null
        sleep 1
        rm .fire.size 2> /dev/null
        rm bucket.* 2> /dev/null

        if [ -e .report.pas.1 ]; then
            cat .report.pas.* >> .unified.report
        # This is the wrong "fi" ######################################## ;-)

            clear
            echo 'Generating Report for this session'
            sleep 3
            cat .unified.report | more
        else
            echo "No reports exist at this time"
        fi
    ;;

    *)
        echo 'Usage: brig [fire (n)|alarm (n)|status|report|quit]'
esac

Note que indentifiquei o seu código. Pessoalmente, posso dar algumas recomendações:

  • Por favor, pelo amor de Deus! não coloque ponto e vírgula e, em seguida, novas linhas! ;-) Se você quer fazer uma boa condicional, escolha um destes exemplos:

    1. then na mesma linha:

      if [ "my coding style" == "can be improved" ]; then
          echo "I accept suggestions ;-)"
      fi
      
    2. then em uma linha separada:

      if [ "my coding style" == "can be improved" ]
      then
          echo "I accept suggestions ;-)"
      fi
      
  • Eu não sei porque você está dividindo comentários curtos sobre várias linhas, eu não faço isso.

  • Por favor, indente seu código 2, 4 ou 8 espaços (eu recomendaria 4).
  • Não durma 3 segundos enquanto não estiver fazendo nada.

Desculpe se cometi algum erro, o inglês não é minha língua materna.

Espero que ajude.

    
por Helio 24.03.2015 / 22:08