仅允许来自标准输入的数字(读取命令)

时间:2014-09-23 08:50:08

标签: linux ksh

我有一个文件,其中包含.sh文件的路由列表,但要执行脚本需要日期,日期为YYYYMMD的文件。当我运行执行脚本列表的脚本时,我使用read命令提示用户输入日期。

我的问题是我需要100%确定用户输入的日期至少是所有数字,我该怎么做?我已经确定输入的最大字符数为8,所以我只需要允许用户输入数字。这就是我到目前为止所做的一切。

echo 'Input date (YYYYMMDD)'
read -n 8 date

有什么想法吗?

三江源。

3 个答案:

答案 0 :(得分:1)

你应该使用while循环:

number=""
while [[ ! $number =~ ^[0-9]{8} ]]; do
    echo Please enter your age
    read number
done

^[0-9]{8}表示" 0到9"

的8个数字

答案 1 :(得分:0)

在得到@Thomas的帮助后,我解决了我的问题。解决方案是将输入变量与正则表达式进行比较。但由于某些原因,直接执行此操作不起作用,因此我将正则表达式保存在变量中,然后比较变量。

reg='^[0-9]{8}$'
while [[ ! $number =~ $reg ]]
do
 echo 'The format is wrong'
done

^< - 行的开头

[0-9] {8}< - 从0到9的8个数字

$< - 行尾

=〜< - 与正则表达式比较

希望这个答案有所帮助!

三江源

PS:如果有人知道直接进行比较时为什么不起作用请告诉我。

答案 2 :(得分:0)

我发现直到很多情况下,直到循环都可以完成这项工作。

我在另一个论坛上找到了进行比较的语法,并且可以正常工作,而此处提到的某些语法却让我发了错。请注意,“ .. + $”以[+-]?..或[+] ..结尾(仅在正数的情况下)。

说实话,我还在学习中,我不知道为什么这种语法对我有用,而其他人在这里却没有。

注意:如果没有-p标志,并且没有解释器-n,这是不起作用的。

#!/bin/bash
read -p 'Input date (YYYYMMDD): ' date
until [[ $date =~ ^[+]?[0-9]{8}+$ ]]
do
    echo "Oops! User input was not 8 characters and/or not a positive integer!"
    echo
    read -p 'Input date (YYYYMMDD): ' date
done

echo "User gave a valid input: $date"

控制台输出:

Input date (YYYYMMDD): very age
Oops! User input was not 8 characters and/or not a positive integer!

Input date (YYYYMMDD): -19670218
Oops! User input was not 8 characters and/or not a positive integer!

Input date (YYYYMMDD): 670218
Oops! User input was not 8 characters and/or not a positive integer!

Input date (YYYYMMDD): 19670218
User gave a valid input: 19670218