外壳脚本为 if 条件提供了太多参数



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

它接受整数作为命令行参数,从 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

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

相关内容

  • 没有找到相关文章

最新更新