Ошибка в скрипте Bucket Brigade, который я запускаю

Команда brig start n должна создать в скрипте passer бригаду из n процессов-прохожих, но когда я запускаю этот скрипт, чтобы начать процесс, я получаю следующую ошибку:

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

Ниже приведена Сценарий: Спасибо за любую помощь, вы можете оказать!:

#!/bin/bash

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

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

case "$1" in

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

alarm)

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

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

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

else

passvar="$2"
export totalpass="$2"
#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
2
задан 10 November 2017 в 20:32

1 ответ

Существует fi, который не должен существовать в строке 114. Корректный код был бы этим:

#!/bin/bash

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

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

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

case "$1" in

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

    alarm)

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

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

            passvar="$2"
            export totalpass="$2"
            #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

Примечание, что я расположил Ваш код с отступом, Лично, я могу дать Вам несколько рекомендаций:

  • , пользой Бога! не помещают точки с запятой и затем новые строки! ;-), Если, Вы хотите сделать хорошее условное взятие одним из этих примеров:

    1. then в той же строке:

      if [ "my coding style" == "can be improved" ]; then
          echo "I accept suggestions ;-)"
      fi
      
    2. then в разделенной строке:

      if [ "my coding style" == "can be improved" ]
      then
          echo "I accept suggestions ;-)"
      fi
      
  • я не знаю, почему Вы разделяете короткие комментарии к различным строкам, я не делаю этого.

  • , расположите свой код с отступом 2, 4 или 8 пробелов (я рекомендовал бы 4).
  • не спят 3 секунды, в то время как Вы ничего не делаете.

Жаль, если я сделал ошибку, английский язык не является моим родным языком.

Hope это помогает.

3
ответ дан 10 November 2017 в 20:32

Другие вопросы по тегам:

Похожие вопросы: