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"
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指出了这一点。
- 3 回答
- 0 关注
- 1029 浏览
添加回答
举报