if文を使えるようになると、Problem 1が解けます。if文は、
if ...; then ... elif ...; then ... else ... fi
という形式になっています。ifの行は、例えば次のようです。
#!/bin/bash if [ 1 -lt 2 ]; then echo 1 fi
-ltはless thanを意味していて、1は2よりも小さいので、echo 1が実行されます。
この、[]は、test関数の別の書き方で、
#!/bin/bash if test 1 -lt 2; then echo 1 fi
とも書けます。このtest関数は、真のとき0を返し、偽のときそれ以外を返します(と思うんだけど、マニュアルにはtrue/falseを返すと書いてある)。なので、[]やtestの代わりに適当な関数を使ってもよくて、返ってくる値によってifのあとが実行されるか決まります(試してみると、値を返さなくても、256の倍数を返しても真判定)。すみません、
If n is omitted, the return status is that of the last command executed in the function body.
と書いてありますね。
これで、コードが書けます。
#!/bin/bash s=0 n=$(($1-1)) for i in `seq 1 $n`; do if [ $((i%5)) -eq 0 ] || [ $((i%3)) -eq 0 ]; then let s+=i fi done echo $s
let
letコマンドは(())と同じで、
((s+=i))
とも書けますが、なんとなく気持ち悪いので、上ではlet使っています。もちろん、
s=$((s+i))
とも書けます。