2011-11-03 2 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) 

예 : $1 % 3의 결과가 제로 또는 아니지만, if true로 취급 0인지의 여부에 따라

$ ./fizzy.sh 
FizzBuzz 
FizzBuzz 
FizzBuzz 

답변

1

expr $1 % 3 = 0 수율 1 또는 0, 그릇된. 쉘은 bash는이

#!/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; else echo N; 다시 0으로 테스트하십시오. –

0

경우 expr를 호출 할 필요가 없습니다 :

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

그래서 당신은 다음과 같이 1. 뭔가에 대해 함수의 출력을 비교해야 할 것입니다 :

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; 
} 
관련 문제