如何在Bash脚本中正确使用while循环?

9

我写了一个脚本,它接受停止和开始数字,并计算其中的数字 - 我正在尝试使它保持递增,无论是否达到“停止”数字,以便它可以继续计数,直到按下ctrl+z键,但它没有识别while条件 - 请问有人能为我纠正语法吗?

  #!/bin/sh

stopvalue=$1
startvalue=$2

if [ $# -ne 2  ]
then
   echo "Error - You must enter two numbers exactly - using default start value of 1"
#exit 0
fi

echo ${startvalue:=1}

while (test "$startvalue" -le "$stopvalue" ||  "$startvalue" -ge "$stopvalue")
do
       startvalue=$((startvalue+1))
        echo $startvalue
done
5个回答

14

既然现在有两个关于 while 循环的答案,我建议使用 for 循环:

for((i=$startvalue;i<=$stopvalue;++i)) do
   echo $i
done

5

我使用简单的while循环程序,这对我来说很有效。在使用while循环之前,我们需要声明任何变量:

sum=0            
temp=1          
while [ $temp -ne 0 ]           
do              
echo "Enter number: OR 0 to Quit :"             
read temp          
sum=`expr $sum + $temp`          
done          
echo $sum        

5

你的主要问题在于你的条件:

while (test "$startvalue" -le "$stopvalue" ||  "$startvalue" -ge "$stopvalue")

你告诉它如果$startvalue小于等于或大于等于$stopvalue,就继续执行。对于任何组合的$startvalue$stopvalue,其中一个将小于、等于或大于另一个。去掉第二个条件,只有当$startvalue小于等于$stopvalue时才继续执行。
你应该这样写:
while [ "$startvalue" -le "$stopvalue" ]

0
while [ "$startvalue" -le "$stopvalue" -o "$startvalue" -ge "$stopvalue" ]
do
       startvalue=$((startvalue+1))
       echo $startvalue
done

这仍然会一直循环,因为$startvalue始终小于(第一个条件),等于(两者)或大于(第二个条件)$stopvalue - Kevin
@Kevin - 很好的观点,我没有花太多时间去看循环是否有意义,我只是在修复语法。 - Andrew Clark
这是正确的语法。在测试中,您必须使用 -o 而不是 **||**。 || 是完全不同的东西,在那之后您需要另一个 shell 命令(比如 test)。 - Cougar
你可以使用||[[ ]]一起,例如[[ condition || condition ]] - Michael Krelin - hacker

-2
startvalue=50
stopvalue=0
while [ $startvalue -lt  $stopvalue -o $startvalue -ne $stopvalue ]; do
echo "Enter number equal to the start value: :"             
read stopvalue
done

1
“仅有代码的答案并不是高质量的答案”。虽然这段代码可能很有用,但您可以通过解释它为什么有效、如何有效、何时应该使用以及其限制是什么来改进它。请编辑您的答案,包括解释和相关文档链接。 - Stephen Ostermiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接