检查一个string是否与Bash脚本中的正则expression式匹配

我的脚本收到的一个参数是以下格式的date: yyyymmdd

我想检查一下,如果我得到一个有效的date作为input。

我该怎么做? 我正在尝试使用正则expression式: [0-9]\{\8}

你可以说:

 [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" 

或更准确:

 [[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes" # |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ | # | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ | # | | | | | # | | \ | | # | --year-- --month-- --day-- | # | either 01...09 either 01..09 end of line # start of line or 10,11,12 or 10..29 # or 30, 31 

也就是说,你可以在bash中定义一个匹配你想要的格式的正则expression式。 这样你可以做到:

 [[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match" 

请注意,这是基于Aleks-Daniel Jakimenko 在bash中用户inputdate格式validation的解决scheme。


在诸如shfish shell中,没有装备bash ,你可以使用grep

 (echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match" 

在bash版本3中,可以使用'=〜'运算符:

 if [[ "$date" =~ "[0-9]\{8\}" ]]; then echo "Valid date" else echo "Invalid date" fi 

参考: http : //tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

注:从Bash版本3.2开始,双括号[[]]中的匹配运算符中的引号不再是必需的

testingstring是否正确的一个好方法是使用命令date:

 if date -d "${DATE}" >/dev/null 2>&1 then # do what you need to do with your date else echo "${DATE} incorrect date" >&2 exit 1 fi