Скрипт Bash для цикла с вложенным оператором if - PullRequest
0 голосов
/ 04 июля 2018

У меня есть такой скрипт:

 #!/bin/bash

 x=${1:-20}

 for ((i=1;i<=x;i++))
 {
      if ((i%3==0))
      {
            echo 'Fizz'
      }
    echo $i
 }

Я получаю цвет ошибки на последней фигурной скобке в VIM, и при попытке запустить скрипт я получаю «синтаксическую ошибку рядом с неожиданным токеном» для той же фигурной скобки. Без вложенного оператора if будет напечатано от 1 до 20 в новой строке для каждого числа, что является ожидаемым результатом. Если число делится на 3, вместо него должно быть напечатано Fizz. Я не так беспокоюсь о том, как реализовать замену, это должно быть легко понять, но я не понимаю, почему я не могу использовать фигурную скобку для закрытия цикла for. Если я вынимаю скобку, я получаю сообщение об ошибке, в котором говорится, что конец файла ожидается. Так какой же правильный синтаксис для завершения цикла for с вложенным оператором if? Я посмотрел онлайн и здесь в стеке, но не нашел формат, похожий на то, что я пытаюсь сделать. Мне не нравится

 for f in * 
Формат

, поскольку его не так легко читать для кого-то, кто работает на другом языке кодирования, и мне нравится, чтобы мой код выглядел очень похожим на разных языках (я тоже использую комментарии, но точно так же, я стараюсь держать вещи как насколько возможно, поэтому я использовал (()) с циклом for.)

Если я закомментирую оператор if и оставлю все остальное без изменений, ошибка исчезнет, ​​и она напечатает

 1
 Fizz
 2
 Fizz

 etc.

Любое понимание этого будет с благодарностью. Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Итак, чтобы помочь кому-то, кто похож на меня, и только начал программировать с помощью bash, вот моя полная программа с комментариями о том, почему я ее кодировал так, как сделал. Если в моем объяснении или в моем стиле форматирования есть ошибки, укажите их. Спасибо! Это было довольно весело писать, называй меня сумасшедшим.

# This will literally just print the string inside the single quotes on the screen
echo 'Try running this again but with something like this: fizzbuzz 25 pot kettle black'

    # The $0 is the first index, in other words the file name of the executable, 
    # this will set the default value of x to 20 but will allow the user to input 
    # something else if they want.
    x=${1:-20}

    # This is the same but with string variables
    f=${2:-FizzBuzz}
    g=${3:-Fizz}
    b=${4:-Buzz}

        # We start the index variable at 1 because it's based on the input, 
        # otherwise it would echo 0 thru 19
        for ((i=1;i<=x;1++))

               do
                   # I recommend using (( )) for if statement arithmetic operations
                   # since the syntax is similar to other programming languages
                   if ((i%3==0 && i%5==0)); then echo $f

                   # you need to use a semicolon to separate if and then if they are 
                   # on the same line, otherwise you can just go to the next line for
                   # your then statement
                   else if ((i%3==0)); then echo $g

                   else if ((i%5==0)); then echo $b

                   else echo $1

                   # You need fi in order to finish an if then statement
                   fi fi fi
              done
0 голосов
/ 04 июля 2018

Итак, вот что я смог выяснить благодаря @Cyrus:

x=${1:-20}
for ((i=1;i<=x;i++))
do
  if ((i%3==0))
  then
    echo 'Fizz'
  else
    echo $i
  fi
done

Во многих отношениях bash проще, чем большинство других языков, но это усложняет работу, когда вы привыкли к языкам "более высокого" уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...