如何在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 

为什么不这项工作?

欢迎任何回复!

+0

您的输入是什么? –

+0

@GillesGouaillardet这就是目标:'读取o'读取用户输入。 –

+0

它应该是'而不是一个整数或小于或等于2'? –

作为@GillesGouaillardet和@Cyrus提到的一个问题是假设使用&&

另一个问题是双引号。

Finaly这个工程:

read o 
while [[ ! $o =~ -?[0-9]+ ]] || [[ $o > 2 ]] ; do 
    echo wrong 
    read o 
done 

非常感谢你的所有。

+0

你用'10'测试过吗? –

+0

@thatotherguy是的,它的工作原理。 –

+0

好极了。在大多数系统上,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

+0

是的@thatotherguy也提到了这一点。但我对此无话可说,因为对我而言'''起作用,而那正是我所需要的。我不知道'-gt'和'>'是否或如何在不同的系统上给这个任务带来不同的结果。 –

+0

在我的例子中'''会比较字符串:''3“>”11“>”1“'和'11 -gt 3 -gt 1'。 –

+0

我认为这取决于我的脚本,它通过别名调用,包含'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