我有一个文件,其中包含.sh文件的路由列表,但要执行脚本需要日期,日期为YYYYMMD
的文件。当我运行执行脚本列表的脚本时,我使用read
命令提示用户输入日期。
我的问题是我需要100%确定用户输入的日期至少是所有数字,我该怎么做?我已经确定输入的最大字符数为8,所以我只需要允许用户输入数字。这就是我到目前为止所做的一切。
echo 'Input date (YYYYMMDD)'
read -n 8 date
有什么想法吗?
三江源。
答案 0 :(得分:1)
你应该使用while循环:
number=""
while [[ ! $number =~ ^[0-9]{8} ]]; do
echo Please enter your age
read number
done
^[0-9]{8}
表示" 0到9"
答案 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