如何检测输入的数量是否在限制之内

如何检测输入的数量是否在限制之内

我想读取三个输入并对其进行计数,以便在用户输入少于三个或多于三个时可以显示自定义错误消息。我正在尝试编写的程序的代码在这里:

echo "Enter three names"
read name1 name2 name3

我想验证这些输入,以便输入恰好是三个名称,不少于也不多。

答案1

通过一次读取三个名称,您无法轻松检查是否确实获得了三个名称,特别是因为名称有时倾向于包含空格。你可以检测到更少通过测试变量是否为空而不是三个名称,但这只能解决一半的问题。

相反,单独读取每个名称:

echo 'Enter three names:' >&2
read -r -p 'Name 1: ' name1
read -r -p 'Name 2: ' name2
read -r -p 'Name 3: ' name3

这将防止用户输入太多名称(因为每次read调用都会读取一个名称,而您只有其中三个),并且您可以使用

if [ -z "$name1" ] ||
   [ -z "$name2" ] ||
   [ -z "$name3" ]
then
    echo 'One or more names were empty!' >&2
    exit 1
fi

或类似的东西来检测输入的名称太少。

或者,如果您想要数组中的名称:

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    read -r -p "Enter name $i: " name[i]
done

然后,您可以${name[i]}在读取后直接检查,也可以稍后在单独的循环中进行检查。

我可能会做类似的事情

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    if ! read -r -p "Enter name $i: " name[i] || [ -z "${name[i]}" ]
    then
        echo 'Invalid input, exiting' >&2
        exit 1
    fi
done

这会将文件结尾(用户按Ctrl+D)或空条目视为错误并退出。

或者,

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    while true; do
        if ! read -r -p "Enter name $i: " name[i]; then
            echo 'Ok, bye' >&2
            exit 1
        elif [ -n "${name[i]}" ]; then
            # string is non-empty (good!), skip to next name
            break
        fi
        echo 'Empty input, try again' >&2
    done
done

这将允许用户通过按终止脚本Ctrl+D,如果输入的字符串为空,它会要求用户再次输入名称。这种输入循环还允许您验证用户的输入除了要求它非空之外,还有其他方式。

相关内容