Bash всегда печатает одно и то же значение независимо от логического значения - PullRequest
1 голос
/ 04 ноября 2011

Относительно SO .

fizzy.sh:

#!/usr/bin/env sh

div3() {
    expr $1 % 3 = 0
}

div5() {
    expr $1 % 5 = 0
}

fizzy() {
    if [ $(div3 $1) ] && [ $(div5 $1) ]; then
        expr "FizzBuzz"
    elif [ $(div3 $1) ]; then
        expr "Fizz"
    elif [ $(div5 $1) ]; then
        expr "Buzz"
    else
        expr "$1"
    fi
}

echo $(fizzy 1)
echo $(fizzy 2)
echo $(fizzy 3)

Пример:

$ ./fizzy.sh
FizzBuzz
FizzBuzz
FizzBuzz

Ответы [ 3 ]

1 голос
/ 09 января 2012

Без необходимости использования функций div3 или div5.

fizzbuzz() { # eg: fizzbuzz 10
   ((($1%15==0))&& echo FizzBuzz)||
   ((($1%5==0))&& echo Buzz)||
   ((($1%3==0))&& echo Fizz)||
   echo $1;
}

Или вы можете сделать все сразу

fizzbuzz() { # eg: fizzbuzz
for i in {1..100};
do
   ((($i%15==0))&& echo FizzBuzz)||
   ((($i%5==0))&& echo Buzz)||
   ((($i%3==0))&& echo Fizz)||
   echo $i;
done;
}
1 голос
/ 04 ноября 2011

expr $1 % 3 = 0 возвращает 1 или 0, в зависимости от того, равен ли результат $1 % 3 нулю или нет, но if рассматривает 0 как истину, а не ложь.

sh-3.2$ if [ 0 ]; then echo ok; fi
ok

Таким образом, вы бынужно сравнить вывод вашей функции с 1. Примерно так:

#!/usr/bin/env sh

div3() {
    expr $1 % 3 = 0
}

div5() {
    expr $1 % 5 = 0
}

fizzy() {
    if [ $(div3 $1) -eq 1 ] && [ $(div5 $1) -eq 1 ]; then
        expr "FizzBuzz"
    elif [ $(div3 $1) -eq 1 ]; then
        expr "Fizz"
    elif [ $(div5 $1) -eq 1 ]; then
        expr "Buzz"
    else
        expr "$1"
    fi
}

for (( i = 1; i <= 15; i++ ))
do
    echo $(fizzy $i)
done
0 голосов
/ 04 ноября 2011

Если ваша оболочка bash, вам не нужно вызывать expr:

div3() { (( $1 % 3 == 0 )); }
div5() { (( $1 % 5 == 0 )); }

fizzbuzz() {
  if div3 $1 && div5 $1; then
    echo FizzBuzz
  elif div3 $1; then
    echo Fizz
  elif div5 $1; then
    echo Buzz
  else
    echo
  fi
}

for ((n=10; n<=15; n++)); do
  printf "%d\t%s\n" $n $(fizzbuzz $n)
done
...