猿问

检查字符串是否与Bash脚本中的正则表达式匹配

我的脚本收到的参数之一是以下格式的日期:yyyymmdd。


我想检查输入的日期是否有效。


我怎样才能做到这一点?我正在尝试使用如下正则表达式:[0-9]\{\8}


梵蒂冈之花
浏览 1030回答 3
3回答

回首忆惘然

你可以说:[[ $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中定义与所需格式匹配的正则表达式。这样,您可以执行以下操作:[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"请注意,这是基于Aleks-Daniel Jakimenko 在bash中的用户输入日期格式验证中的解决方案。在其他Shell中,可以使用grep。如果您的外壳符合POSIX,请执行(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"在不符合POSIX的fish中,您可以执行echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"

米琪卡哇伊

我会使用expr match而不是=~:expr match "$date" "[0-9]\{8\}" >/dev/null && echo yes这比当前接受的使用方法更好,=~因为它=~还会匹配空字符串,恕我直言,它不应该。假设badvar未定义,则[[ "1234" =~ "$badvar" ]]; echo $?给出(不正确)0,而expr match "1234" "$badvar" >/dev/null ; echo $?给出正确的结果1。我们必须使用>/dev/nullhide expr match的输出值,这是匹配的字符数;如果找不到匹配项,则为0。请注意,其输出值与退出状态不同。如果找到匹配项,则退出状态为0,否则为1。通常,的语法为expr:expr match "$string" "$lead"要么:expr "$string" : "$lead"$lead正则表达式在哪里 它的exit status将是真正的(0),如果lead匹配的领先的切片string(是否有此名字吗?)。例如,expr match "abcdefghi" "abc"退出true,但expr match "abcdefghi" "bcd"退出false。(感谢@Carlo Wood指出了这一点。
随时随地看视频慕课网APP
我要回答