我有一个简单的代码:
compare()
{
n=$#
echo "Refference number: "
read x
while [ $n -gt 0 ]
do
if [ $1 -gt $x ]
then
echo "A greater number was found: " $1
fi
shift
done
}
以这种方式,脚本不能正常工作。我在while行上得到一个带有错误的无限循环。
如果我在使用while [ $# -gt 0 ]
行时替换它,一切正常。
为什么会这样?不是$ n = $#? 我使用的是CentOS 7。
答案 0 :(得分:3)
您可以直接在while循环中使用$#
。每次拨打shift
时,它都会自然发生变化。
while [ $# -gt 0 ]; do
...
shift
done
否则,您每次迭代都必须自己更新$n
。
while [ "$n" -gt 0 ]; do
...
shift
((--n))
done
在此时分配n=$#
使$n
等于$#
。它并不意味着$#
更改时会自动更新。
答案 1 :(得分:1)
$n
包含$#
分配时的值副本。此后没有任何更改$n
,因此循环根本不运行或连续运行。
在循环条件中使用$#
时,shift
会将参数数量减少一个,因此$#
减少,循环终止。