如何在while语句中检查一个变量是不是一个字符而是一个整数且不大于n?
我只能弄清楚如何检查一个变量是不是一个字符。如何在while语句中检查一个变量是不是一个字符而是一个整数且不大于n?
这工作:
read o
while [[ ! $o =~ -?[0-9]+ ]]; do
echo wrong
read o
done
但我想在一个检查while语句,如果它不是一个字符,但整数和更大(我想>
没有>=
)超过n。
这是我到目前为止已经试过:
read o
while [[ ! $o =~ -?[0-9]+ ]] && [[ $o > "2" ]] ; do
echo wrong
read o
done
为什么不这项工作?
欢迎任何回复!
作为@GillesGouaillardet和@Cyrus提到的一个问题是假设使用&&
。
另一个问题是双引号。
Finaly这个工程:
read o
while [[ ! $o =~ -?[0-9]+ ]] || [[ $o > 2 ]] ; do
echo wrong
read o
done
非常感谢你的所有。
你用'10'测试过吗? –
@thatotherguy是的,它的工作原理。 –
好极了。在大多数系统上,8和9被拒绝,而10被接受。 –
认为积极。
while read -r o; do
if [[ $o =~ -?[0-9]+ ]] && [[ $o -gt 3 ]]; then
break
fi
echo "Wrong"
done
echo "I like your o=$o"
我用-gt
而不是>
,因为我想接受10
。
是的@thatotherguy也提到了这一点。但我对此无话可说,因为对我而言'''起作用,而那正是我所需要的。我不知道'-gt'和'>'是否或如何在不同的系统上给这个任务带来不同的结果。 –
在我的例子中'''会比较字符串:''3“>”11“>”1“'和'11 -gt 3 -gt 1'。 –
我认为这取决于我的脚本,它通过别名调用,包含'set -f',比如'f。 *。*'在脚本内部,数组将通过'find'命令填充。但是,最终我有一个可行的解决方案。非常感谢你的努力。 –
在Bash中,您可以使用(())
构造。它期望一个算术表达式;在算术表达式中,非整数计算结果为零:
$ o=3
$ ((o > 3)) && echo "Greater" || echo "Not greater or not a number"
Not greater or not a number
$ o=4
$ ((o > 3)) && echo "Greater" || echo "Not greater or not a number"
Greater
$ o=abc
$ ((o > 3)) && echo "Greater" || echo "Not greater or not a number"
Not greater or not a number
因此,要解决你的代码,你可以使用
read o
while ! ((o > 3)); do
echo "wrong"
read o
done
但其实我更喜欢Walter A.'s approach(重写使用(())
):
while read o; do
((o > 3)) && break
echo "wrong"
done
您的输入是什么? –
@GillesGouaillardet这就是目标:'读取o'读取用户输入。 –
它应该是'而不是一个整数或小于或等于2'? –