2011-11-03 58 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; 
}