我是Shell脚本的新手。我已经编写了一个函数来检查天气数字是否为素数但是如果条件允许的话,我会得到一元运算符的误差。请指出我做错的地方。
file:fprime.sh
prime ()
{
n=$1
t=0
for i in {2..$n}
do
r=`expr $n % $i`
if [ $r == 0 ]
then
t=`expr t + 1`
fi
done
if [ $t == 1 ]
then
echo "prime"
else
echo "not prime"
fi
}
prime
输出:
~$ ./fprime.sh 5
expr: syntax error
./fprime.sh: line 8: [: ==: unary operator expected
不是素数
答案 0 :(得分:1)
尝试更改,3位也有其他语法错误,
1) if [ $r == 0 ]
// to
if [ $r -eq 0 ]
2) t=`expr t + 1`
// to
t=`expr $t + 1`
3) if [ $t == 1 ]
// to
if [ $t -eq 1 ]
<强> 备注 强>
1)和 3),-eq
用于将bash ==
中的整数等同于等于String / charactor(s)< / p>
2) - 变量$
错过t
符号
另外,只需指出,您可以直接使用$1
而无需再次分配给变量n
答案 1 :(得分:0)
如果数字为素数,则以下函数将返回0(无错误 - > true)。
如果数字不是素数,函数将返回1(错误 - > false)。
对于那些以前从未见过的人, REMAINDER_S 是一个数组(其中存储了除以零的每个提醒)。
由于素数只能由它们自己整数(当然还有1),所以当一个除法提供的提醒等于零时,该数字将不是素数。
否则(没有提醒为零),数组 REMINDER_S 将为空,且数字将为素数。
不要忘记使用&#34; break&#34;在第一个&#34;如果&#34;声明,如果您打算替换&#34;返回1&#34;对于一些回音消息。
is_prime () {
declare -a REMAINDER_S=()
let ARG_1=$1-1
for N in $(seq 2 $ARG_1)
do
let REMINDER=$1%$N
if [ $REMINDER == 0 ]
then
REMINDER_S=("${REMINDER_S[@]}" $REMINDER)
return 1
fi
done
if [ ${#REMINDER_S[@]} == 0 ]
then
return 0
fi
}
答案 2 :(得分:0)
一个简单的代码:
function prime()
{
for((i=2; i<=num; i++))
do
if [ `expr $num % $i` == 0 ]
then
echo $num is not prime
exit
fi
done
echo $num is a prime number
}
read num;
prime "$num";