我想知道哪种方法更好,以不区分大小写的方式检查var(键盘上的用户输入)是否与正则表达式匹配。我知道有一些不同的可能性。示例:我希望正则表达式匹配空值和所有此列表:Y
,N
,y
,n
,Yes
,{{1} },No
,YES
我搜索了不同的方法。不确定是否可能是另一个更好的。我会让几个人为我工作。
第一个是一个有点“棘手”的设置全部为大写以进行比较:
NO
第二个使用#!/bin/bash
yesno="null" #any different value for initialization is valid
while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do
read -r yesno
done
。但不确定如果这样做之后它可以恢复,因为我不想为所有脚本设置它。
shopt -s nocasematch
这些正则表达式能否以任何方式得到改善? 有更好(更优雅)的方法吗? 第二种方法,有没有办法恢复该设置?
答案 0 :(得分:3)
您可以先将字符串转换为小写并进行检查。然后,您根本不需要触摸nocasematch
。变量的内容也保持不变。
# use the ${var,,} syntax to conver to lowercase
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do
read -r -p "yes/no? " yesno
done
答案 1 :(得分:2)
shopt
是一种很好的方法,因为您可以在变量yesno
中保留最初输入的值。
你可以稍微重构你的正则表达式:
#!/bin/bash
yesno="null"
# set nocasematch option
shopt -s nocasematch
while [[ ! ${yesno} =~ ^([yn]|yes|no)?$ ]]; do
read -r -p "Enter a yes/no value: " yesno
done
# unset nocasematch option
shopt -u nocasematch
# examine your variable
declare -p yesno