I want to know which method is better to check if a var (input by user on keyboard) matches with a regex in a case insensitive way. I know there are some different possibilities. Example: I want a regex matching an empty value and all of this list: Y
, N
, y
, n
, Yes
, No
, YES
, NO
I searched looking different methods. Not sure if could be another better. I'll put a couple of them working for me.
First one is a little "tricky" setting all to uppercase for the comparison:
#!/bin/bash yesno="null" #any different value for initialization is valid while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do read -r yesno done
Second one is using
shopt -s nocasematch
. But not sure if after doing that it can be reverted because I don't want to set this for all the script.#!/bin/bash yesno="null" #any different value for initialization is valid shopt -s nocasematch while [[ ! ${yesno} =~ ^[yn]$|^yes$|^no$|^$ ]]; do read -r yesno done
Can these regex get improved in any way? Is there a better (more elegant) method? On second method, is there a way to revert that setting?
shopt
is good approach as you are able to retain originally entered value in variable yesno
.
You can just refactor your regex a bit:
#!/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
You can first convert the string into lowercase and check it. Then you don't need to touch nocasematch
at all. The content of the variable is left unmodified as well.
# use the ${var,,} syntax to conver to lowercase
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do
read -r -p "yes/no? " yesno
done
来源:https://stackoverflow.com/questions/44106842/case-insensitive-regex-in-bash