Как уже упоминал @Steve , case
требует глобуса, а не регулярного выражения. Вы все еще можете использовать case
, вам просто нужно вместо него указать globs:
#!/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
.