2

我当前的脚本执行以下操作;

它将整数作为命令行参数并从 1 到 N 开始,它检查数字是否可被 3、5 或两者整除。它只是打印出 3 的 Uc、5 的 Bes 和 3,5 的 UcBes。如果命令行参数为空,它执行相同的操作,但循环转到 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
4

3 回答 3

6

请注意,这[实际上是test内置 shell 的同义词(which [在您的终端中尝试),而不是像其他语言那样的条件语法,因此您不能这样做:

if [ [$i % 3] -eq 0 ]; then

此外,请始终确保在 、 和组成它们之间的逻辑条件检查的变量之间至少有一个[空格]

计算模数等表达式的语法是由 包围$((...)),其中的变量名不需要前缀$

remainder=$((i % 3))
if [ $remainder -eq 0 ]; then
于 2012-11-15T20:49:47.047 回答
3

您可能应该使用类似的东西:

if [ $(($i % 3)) -eq 0 ]

代替

if [ $i % 3 -eq 0 ]
if [ [$i % 3] -eq 0 ]
于 2012-11-15T20:50:15.960 回答
1

您的脚本可以大大简化。例如:

#!/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

如果参数不是整数,则给出稍有不同的错误消息,但在其他方面表现相同。

于 2012-11-15T22:29:27.580 回答