2011-11-03 55 views
1

SO有关。无论布尔值如何,Bash始终打印相同的值

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 

回答

1

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

了'如果[0]; ...'测试没有做你认为的事情。你可以用'if [1]'或'if [cow]'或任何非空字符串得到相同的结果。这将演示你想要什么:'if $(exit 0);然后回显Y;否则回显N; fi'并再次测试1个intend为0 –

0

如果你的shell是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 
+0

差不多。我想fizzbuzz是一个功能。 – mcandre

+0

它不应该很难采取我给你的东西,并从中写出一个函数。这实际上就是'if'陈述。 –

+0

Bash语法简单直观。如果我可以将其重写成一个函数,我会这样做。 – mcandre

1

不需要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; 
}