3 回答

TA貢獻1847條經(jīng)驗 獲得超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中定義與所需格式匹配的正則表達式。這樣,您可以執(zhí)行以下操作:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
請注意,這是基于Aleks-Daniel Jakimenko 在bash中的用戶輸入日期格式驗證中的解決方案。
在其他Shell中,可以使用grep。如果您的外殼符合POSIX,請執(zhí)行
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
在不符合POSIX的fish中,您可以執(zhí)行
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"

TA貢獻1998條經(jīng)驗 獲得超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的輸出值,這是匹配的字符數(shù);如果找不到匹配項,則為0。請注意,其輸出值與退出狀態(tài)不同。如果找到匹配項,則退出狀態(tài)為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指出了這一點。
添加回答
舉報