Shell
Unix 案例正則表達式
我正在嘗試使用
case
命令匹配日期模式,但它不起作用。有人能幫我嗎 ?輸入:
01/05/1900
或5/6/1900
使用的案例陳述:
ptn="[0-9]|[0-9][0-9]/[0-9]|[0-9][0-9]/[0-9][0-9]|[0-9][0-9][0-9][0-9]" case "$dt" in $ptn ) echo "valid pattern" ;; *) echo "invalid" esac
但是 case 語句中使用的模式並未評估上述 2 個日期輸入。
試試這個。
case
只了解 glob,因此處理正則表達式並不簡單。不過,=~
運營商在這裡提供了一些解決方案。#!/bin/bash INP="01/05/1900" ptn="^([0-9]|[0-9][0-9])/([0-9]|[0-9][0-9])/([0-9][0-9]|[0-9][0-9][0-9][0-9])$" if [[ $INP =~ $ptn ]] ; then echo valid pattern else echo invalid fi
如果您想減小正則表達式的大小,
^[0-9]{1,2}/[0-9]{1,2}/([0-9]{2}|[0-9]{4})$
也同樣有效。
正如@Steve 已經提到的,
case
需要一個 glob,而不是正則表達式。你仍然可以使用case
,你只需要給它 glob 代替:#!/bin/sh dt="$1"; ptn1="[0-9]/[0-9]/[0-9][0-9][0-9][0-9]" ## N/N/NNNN ptn2="[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9]" ## NN/N/NNNN ptn3="[0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]" ## N/NN/NNNN ptn4="[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]" ## NN/NN/NNNN case "$dt" in $ptn1|$pt2|$pt3|$pt4 ) echo "$dt : valid pattern" ;; *) echo "$dt : invalid" ;; esac
然後,像這樣執行腳本:
foo.sh 15/6/1900
例如:
$ for i in 05/6/1900 5/06/1900 05/06/1900 05/06/19 123/123/123; do foo.sh $i; done 05/6/1900 : valid pattern 5/06/1900 : valid pattern 05/06/1900 : valid pattern 05/06/19 : invalid 123/123/123 : invalid
如果您可以訪問 GNU 工具(特別是 GNU
date
),您還可以使用以下技巧:#!/bin/sh dt="$1"; date -d $dt &> /dev/null && echo "$dt : Valid pattern" || echo "$dt :Invalid pattern"
然後,在與以前相同的測試輸入上:
$ for i in 05/6/1900 5/06/1900 05/06/1900 05/06/19 123/123/123; do foo.sh $i; done 05/6/1900 : Valid pattern 5/06/1900 : Valid pattern 05/06/1900 : Valid pattern 05/06/19 : Valid pattern 123/123/123 :Invalid pattern
如您所見,即使在例如年份被指定為
YY
而不是YYYY
.