【发布时间】:2017-07-31 17:09:10
【问题描述】:
我目前正在学习 bash,并且正在研究循环函数以在值不是预期的情况下调用该函数。
我创建了一个小函数
#!/bin/bash
find_number(){
echo "Enter number"
read number
if [ ! $number == 1 ]; then
echo is not 1, enter number again
find_number
fi
echo "Got it"
}
find_number
如果你输入了错误的值,它会重新启动函数并创建一个循环,但唯一的问题是函数会自行循环,最后当它继续时,它会尽可能多地返回回显。
示例:
Enter number
5
is not 1, enter number again
Enter number
5
is not 1, enter number again
Enter number
1
Got it
Got it
Got it
正如你在这里看到的,我已经得到了 3 次结果。 为了解决这个问题,我用另一种方式编写了我的代码。
#!/bin/bash
find_number(){
echo "Enter number"
while read number; do
if [ ! $number == 1 ]; then
echo is not 1, enter number again
else
break
fi
done
echo "Got it"
}
find_number
我的问题是......我是通过应用第二种方法以正确的方式还是有另一种方法?
感谢您的反馈
【问题讨论】:
-
仅供参考,
==不是 POSIX 标准化的test功能的一部分;标准字符串比较运算符是=。并且总是引用你的扩展——! [ "$number" = 1 ]不太容易出现意外;考虑如果用户输入23 = 23 -o 5会发生什么;你会得到[ ! 23 = 23 -o 5 == 1 ]。 -
当你想在 bash 中检查不等于 int 的东西时,使用
if [ $number != 1 ]。它也更具可读性。 -
@Vinny, err, re: "to an int" - 这是字符串比较,而不是数字比较。 (
=也是字符串比较;如果我们确定这些值在相同的基数中并且没有前导零,那么在我们开始进行大于或小于比较之前,这并不重要)。 -
...由于这将递归描述为“循环”是不准确的,因此我将其称为过于宽泛——这根本不是一个真正的 bash 问题;在任何语言的调用堆栈(因此允许可重入函数)中,有人可能会有同样的误解、误解和相关的错误。
-
@CharlesDuffy 我的意思是数字比较,谢谢指出。