为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梵蒂冈之花 2019-11-08 10:16:38
我的脚本收到的参数之一是以下格式的日期:yyyymmdd。我想检查输入的日期是否有效。我怎样才能做到这一点?我正在尝试使用如下正则表达式:[0-9]\{\8}
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

你可以说:


[[ $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"


查看完整回答
反对 回复 2019-11-08
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我会使用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指出了这一点。


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 1029 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信