我当前的脚本执行以下操作;
它接受整数作为命令行参数,从 1 到 N 开始,它检查数字是否可以被 3、5 或两者整除。它只是打印出 Uc 表示 3,Bes 表示 5,UcBes 表示 3,5。如果命令行参数为空,则执行相同的操作,但循环变为 1 到 20。
我遇到此错误"第 11、15 和 19 行的参数太多"。
这是代码:
#!/bin/bash
if [ ! -z $1 ]; then
for i in `seq 1 $1`
do
if [ [$i % 3] -eq 0 ]; then
echo "Uc"
elif [ i % 5 -eq 0 ]; then
echo "Bes"
elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
then
echo "UcBes"
else
echo "$i"
fi
done
elif [ -z $1 ]
then
for i in {1..20}
do
if [ i % 3 -eq 0 ]
then
echo "Uc"
elif [ i % 5 -eq 0 ]
then
echo "Bes"
elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
then
echo "UcBes"
else
echo "$i"
fi
done
else
echo "heheheh"
fi
,[
实际上是 shell 中内置test
的同义词(尝试在终端中which [
),而不是像其他语言那样的条件语法,所以你不能这样做:
if [ [$i % 3] -eq 0 ]; then
此外,始终确保[
、]
之间至少有一个空格,并且构成逻辑条件的变量在它们之间检查。
计算像模这样的表达式的语法是用$((...))
括起来的,里面的变量名不需要以$
为前缀:
remainder=$((i % 3))
if [ $remainder -eq 0 ]; then
您可能应该使用类似以下内容:
if [ $(($i % 3)) -eq 0 ]
而不是
if [ $i % 3 -eq 0 ]
if [ [$i % 3] -eq 0 ]
您的脚本可以大大简化。 例如:
#!/bin/sh
n=0
while test $(( ++n )) -le ${1:-20}; do
t=$n
expr $n % 3 > /dev/null || { printf Uc; t=; }
expr $n % 5 > /dev/null || { printf Bes; t=; }
echo $t
done
如果参数不是整数,则给出略有不同的错误消息,但在其他方面行为相同。