模式匹配的价值 - bash

3

我需要从<2018-2099>中获取值,如果用户输入错误的值,则脚本将告诉他该值不正确,并要求他重新输入。

我已经有类似这样的东西,但它不起作用... 有什么建议吗?

#!/bin/bash

read -r -p "Type year [value from 2019-2099]" year
if [[ "$year" =~ ^(20[1-9]|[1-9])+$ ]]; then
    mkdir -p "/home/$year/"
else
    echo "$year - value is not correct. Try again." >&2 && exit 1
fi

为什么不直接检查它是否是一个数字 [0-9]+,然后 [[ "${year}" -ge 2018 ]] && [[ "${year}" -le 2099 ]] - tomix86
现在它可以工作了,但如何循环执行呢?我的意思是当用户输入不正确的值时,程序将从头开始执行? - Marcin A
你应该编辑你的问题,包括“循环”部分。我会把这个放进一个函数里,在循环中调用它。 - tomix86
2个回答

1
你可以尝试这个:

until 
    read -r -p "Type year [2019-2099]: " year
    [[ $year =~ ^2[0-9]+$ ]]  && (( year >= 2018 && year <= 2099 ))
do
    echo "Incorrect value" >&2
done

echo "OK: $year"

1

您可以使用函数和 until 循环来实现此目的,考虑以下代码:

readYear() {
    read -r -p "Type year [value from 2018-2099]" year
    [[ "${year}" =~ ^[0-9]{4}$ ]] && [[ "${year}" -ge 2018 ]] && [[ "${year}" -le 2099 ]]
}

until readYear; do
    echo "${year} - value is not correct. Try again." >&2
done

如果输入的值有效,该函数返回0,然后循环终止。


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