用户输入多样性的挑战
在开发交互式shell脚本时,我们经常需要处理用户输入的确认操作。实际测试表明,不同用户对"是"的输入习惯差异很大:
# 用户可能输入的各种形式
Y/y
YES/Yes/yes
甚至可能是中文的"是"
传统实现方式的痛点
大多数开发者最初会这样处理:
read -p '请确认操作(yes/no): ' answer
if [ "$answer" = 'Y' -o "$answer" = 'YES' -o "$answer" = 'Yes' \
-o "$answer" = 'y' -o "$answer" = 'yes' ]; then
echo "确认操作"
fi
这种方式存在明显问题:条件判断冗长、难以维护、不支持国际化。
更优雅的解决方案
方案1:使用case语句
read -p '请确认操作(yes/no): ' answer
case "${answer,,}" in
y|yes)
echo "确认操作"
;;
*)
echo "取消操作"
;;
esac
关键技巧:
1. ${answer,,}
将输入转为小写
2. case语句模式匹配更简洁
方案2:正则表达式匹配
read -p '请确认操作(yes/no): ' answer
if [[ "$answer" =~ ^[yY]([eE][sS])?$ ]]; then
echo "确认操作"
fi
优势:
- 单行正则匹配所有变体
- 支持更灵活的匹配规则
方案3:支持国际化
read -p '请确认操作(是/yes/no): ' answer
case "${answer,,}" in
y|yes|是|はい)
echo "确认操作"
;;
*)
echo "取消操作"
;;
esac
最佳实践建议
- 始终在提示中明确示例输入格式
- 对输入进行标准化处理(转小写/去除空格)
- 考虑添加默认值:
[Y/n]
- 对于重要操作,建议二次确认
read -p "确定要删除吗?[y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi