Bash 中不区分大小写的正则表达式
Case insensitive regex in Bash
我想知道哪种方法更适合检查 var(用户在键盘上输入的)是否以不区分大小写的方式与正则表达式匹配。我知道有一些不同的可能性。示例:我想要一个匹配空值的正则表达式和所有此列表:Y
、N
、y
、n
、Yes
、No
, YES
, NO
我搜索了不同的方法。不确定是否可以更好。我会让其中几个为我工作。
第一个有点"tricky"设置为大写比较:
#!/bin/bash
yesno="null" #any different value for initialization is valid
while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do
read -r yesno
done
第二个正在使用 shopt -s nocasematch
。但不确定这样做之后是否可以还原,因为我不想为所有脚本设置它。
#!/bin/bash
yesno="null" #any different value for initialization is valid
shopt -s nocasematch
while [[ ! ${yesno} =~ ^[yn]$|^yes$|^no$|^$ ]]; do
read -r yesno
done
这些正则表达式能以任何方式得到改进吗?
有没有更好(更优雅)的方法?
关于第二种方法,有没有办法恢复该设置?
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
你可以先把字符串转成小写再检查。那么你根本不需要触摸 nocasematch
。变量的内容也保持不变。
#
# NOTE: This requires Bash 4.0+ (bash 4.0 was released on 2009-02-20)
#
# use the ${var,,} syntax to convert to lowercase
#
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do
read -r -p "yes/no? " yesno
done
我想知道哪种方法更适合检查 var(用户在键盘上输入的)是否以不区分大小写的方式与正则表达式匹配。我知道有一些不同的可能性。示例:我想要一个匹配空值的正则表达式和所有此列表:Y
、N
、y
、n
、Yes
、No
, YES
, NO
我搜索了不同的方法。不确定是否可以更好。我会让其中几个为我工作。
第一个有点"tricky"设置为大写比较:
#!/bin/bash yesno="null" #any different value for initialization is valid while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do read -r yesno done
第二个正在使用
shopt -s nocasematch
。但不确定这样做之后是否可以还原,因为我不想为所有脚本设置它。#!/bin/bash yesno="null" #any different value for initialization is valid shopt -s nocasematch while [[ ! ${yesno} =~ ^[yn]$|^yes$|^no$|^$ ]]; do read -r yesno done
这些正则表达式能以任何方式得到改进吗? 有没有更好(更优雅)的方法? 关于第二种方法,有没有办法恢复该设置?
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
你可以先把字符串转成小写再检查。那么你根本不需要触摸 nocasematch
。变量的内容也保持不变。
#
# NOTE: This requires Bash 4.0+ (bash 4.0 was released on 2009-02-20)
#
# use the ${var,,} syntax to convert to lowercase
#
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do
read -r -p "yes/no? " yesno
done