如何将变量分隔为bash中的数字范围?

时间:2016-05-30 12:27:34

标签: bash shell

read primeranota  
if test $primeranota ={1..10} \
    -o  $primeranota!={A..Z} \
    -o  $primeranota !={a..z}  ; then
    echo "Nota introducida con exito."
    pausa
else
    until "$primeranota" -ge 0 -a "$primeranota" -le 10; do
        echo -n "Escribe una nota del [0-10]: "
        read primeranota
    done

我还想将输入限制为只是数字,但我不知道如何限制它。

我已经坚持了好几天......提前谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用模式:

#!/bin/bash
unset input
shopt -s extglob # For bash < 4.1.
until [[ $input == @(0|[1-9]*([0-9])) && $input -le 10 ]]; do
    read -r input
done
  • @表示必须存在其中一个替代方案,即0或正数
  • 正数以非零[1-9]开头,后跟任意数字(或无)*([0-9])

答案 1 :(得分:1)

POSIX shell,(没有 bash isms)。如果数字的 size 无关紧要(即数字小于19位左右),请使用“ -eq ”测试运算符,如果字符串不是整数。这是一个“ readbetween ”脚本,可以使用:

#!/bin/sh
# Usage: readbetween n1 n2
# inputs one line from standard input between (and including) n1 and n2
unset s n
IsNumber()  # usage: IsNumber string
{           #  returns: flag
        [ $1 -eq $1 ] 2> /dev/null
}

read -p "Number between $1 and $2?  " n
if IsNumber "$n" ; then
    if [ $n -gt $2 ] ; then
        s=big
    elif [ $n -lt $1 ] ; then
        s=small
    else
        echo $n
        exit 0
    fi
else
    s=stringy
fi
echo "too $s: $n" > /dev/stderr
exit 1

测试运行,调用:

直到x = ./readbetween 0 10;做:;完成echo $ x

...并假设用户犯了错误:

  

0到10之间的数字? 33个
  太大了:33
  0到10之间的数字? ABC
  太古怪了:abc
  0到10之间的数字? 5.5
  过于拉丝:5.5
  0到10之间的数字? -1
  太小了:-1
  0到10之间的数字? 4
  4

答案 2 :(得分:0)

您可以在bash中使用[[ ... ]]

read -r input
if [[ "$input" =~ ^[a-zA-Z0-9]+$ ]]; then
  echo '$input contains 0-9, a-z and A-Z only'
fi

这样可以使0-9a-zA-Z多出一次。

答案 3 :(得分:0)

仅允许$primeranota的数字:

read primeranota
[[ $mavar =~ [0-9]*[0-9] ]] && echo numbers

允许1到10范围内的数字:

shopt -s extglob # you may have to set extglob to 'on'
until [[ $primeranota == @(0|[1-9]|10) ]]; do
    echo -n "Escribe una nota del [0-10]:"
    read primeranota
done