Bash检查值是否为整数且在范围内。

3

我阅读了这个stackoverflow的问题...

Bash:检查用户输入是否正确

它完成了我大部分想要的功能,但是我需要检查的不仅仅是一个整数,而是在一个变量范围内的整数...

该脚本查找目录中的文件,然后为其分配一个数字...

  1. 文件1
  2. 文件2
  3. 文件3 等等....

用户选择编号,然后脚本执行相应文件的命令......变量$FILELIST是文件总数。

按照上一个stackoverflow示例,我尝试了以下方法...

FILENUM=""
while [[ ! ($FILENUM =~ ^[0-$FILELIST]+$) ]]; do
    echo " "
    echo "Please enter the file number: "
    read -p "1 - $FILELIST" FILENUM < /dev/tty
done

echo "$FILENUM"

然而,这会引发一个语法错误:在while一行中出现了意外的“(”,期望是“do”,我不确定原因,我怀疑$FILELIST必须以某种方式加括号,但是为什么上述代码可行的解释将有助于我理解问题。

谢谢


我应该补充说明这是在busybox shell中,这可能是问题的原因? - user2109420
作为第一条评论,正则表达式 ^[0-$FILELIST]+$ 可能不是您想要的。假设 $FILELIST 是 100,那么这个正则表达式就是 ^[0-100]+$,它只会匹配包含 0 和 1 的数字,而不是介于 0 和 100 之间的数字... - mathematical.coffee
我尝试将代码行更改为测试0-9变量(用9替换$FILELIST),但它仍然抛出相同的错误,所以我开始认为这可能是busybox的限制? - user2109420
谢谢M.C,但文件列表永远不会超过9个,所以那里没有问题,我真的在努力理解为什么会出现错误,以帮助我的未来编码,而不是只是跟随别人的例子。 - user2109420
我对Busybox不是很了解,但是维基百科上说它使用的是ash shell而不是bash,所以你可能需要重新标记你的问题并查找一些ash语法(在这方面我无法帮助你)。 - mathematical.coffee
1个回答

1

针对bash的回答:

您无需重新发明轮子:使用select内置功能:

cd /path/to/directory
PS3="Select a file: "
select file in *; do
    if [[ $file ]]; then break; fi
done
echo "You selected '$file'"
echo "You selected file number $REPLY"

要检查一个数字是否在特定范围内,我会写成:

if (( 0 <= $number && $number <= $max )); then echo "in range"; fi

由于您正在使用ash,您可以将此用作参考:http://manpages.debian.net/cgi-bin/man.cgi?query=dash

while true; do
    FILENUM=""
    echo 
    echo "Please enter the file number: "
    read -p "1 - $FILELIST" FILENUM < /dev/tty
    if expr "$FILENUM" : '[0-9]\+$' &&
       [ $FILENUM -gt 0 ] && 
       [ $FILENUM -le $FILELIST ]
    then
        break
    fi
done
echo "$FILENUM"

很遗憾,select不是busybox内置的命令之一。请参考http://www.busybox.net/downloads/BusyBox.html。 - user2109420

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接