我想读取三个输入并对其进行计数,以便在用户输入少于三个或多于三个时可以显示自定义错误消息。我正在尝试编写的程序的代码在这里:
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,如果输入的字符串为空,它会要求用户再次输入名称。这种输入循环还允许您验证用户的输入除了要求它非空之外,还有其他方式。