【问题标题】:bash check value is integer and in rangebash 检查值是整数并且在范围内
【发布时间】:2013-02-11 08:24:32
【问题描述】:

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

Bash: check user input is correct

它完成了我想要的大部分操作,而不是检查它只是一个整数,我需要检查它是一个变量范围内的整数....

脚本在目录中查找文件,然后为它们分配一个编号...

  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中,所以这可能是问题吗?
  • 嗯,作为第一条评论,正则表达式 ^[0-$FILELIST]+$ 可能不是您想要的。假设 $FILELIST 是 100,那么正则表达式是 ^[0-100]+$,它只会匹配其中包含 0 和 1 的数字,而不是 0 到 100 之间的数字...
  • 我尝试更改行以测试 0-9 变量(将 $FILELIST 替换为 9)并引发相同的错误,所以我开始认为这可能是一个忙盒限制?
  • 感谢 MC,但文件列表永远不会超过 9,所以那里没有问题,我真的想了解为什么会抛出错误以帮助我为未来编码,而不是仅仅跟随别人的例子。
  • 我对 Busybox 了解不多,但 Wiki 说它使用 ash shell 而不是 bash,所以您可能需要重新- 标记您的问题并查找一些 ash 语法(我在这里也帮不了您)

标签: variables integer busybox


【解决方案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"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2011-03-31
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多