Verifique se uma string corresponde a um regex no script Bash

Um dos argumentos que meu script recebe é uma data no seguinte formato: yyyymmdd .

Quero verificar se recebo uma data válida como input.

Como posso fazer isso? Eu estou tentando usar um regex como: [0-9]\{\8}

Você pode dizer:

 [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" 

Ou mais preciso:

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

Ou seja, você pode definir um regex no bash correspondente ao formato desejado. Desta forma você pode fazer:

 [[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match" 

Observe que isso é baseado na solução de Aleks-Daniel Jakimenko em Verificação do formato de data de input do usuário no bash .


Em shells como sh ou fish – less equipped então bash – você pode usar grep :

 (echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match" 

Na versão 3 do bash você pode usar o operador ‘= ~’:

 if [[ "$date" =~ "[0-9]\{8\}" ]]; then echo "Valid date" else echo "Invalid date" fi 

Referência: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF

NOTA: A cotação no operador correspondente entre os colchetes duplos, [[]], não é mais necessária a partir da versão 3.2 do Bash.

Uma boa maneira de testar se uma string é uma data correta é usar a data do comando:

 if date -d "${DATE}" >/dev/null 2>&1 then # do what you need to do with your date else echo "${DATE} incorrect date" >&2 exit 1 fi 

Eu usaria a expr match vez de =~ :

 expr match "$date" "^[0-9]\{8\}" >/dev/null && echo yes 

Isso é melhor que a resposta aceita atualmente de usar =~ porque =~ também corresponderá a strings vazias, o que IMHO não deveria. Suponha que o badvar não esteja definido, então [[ "1234" =~ "$badvar" ]]; echo $? [[ "1234" =~ "$badvar" ]]; echo $? dá (incorretamente) 0 , enquanto expr match "1234" "$badvar" >/dev/null ; echo $? expr match "1234" "$badvar" >/dev/null ; echo $? dá resultado correto 1 .

Nós temos que usar >/dev/null para esconder o valor de saída da expr match , que é o número de caracteres encontrados ou 0 se nenhuma correspondência for encontrada. Observe que seu valor de saída é diferente de seu status de saída . O status de saída é 0 se houver uma correspondência encontrada ou 1 caso contrário.

Geralmente, a syntax para expr é:

 expr match "$string" '$substring' 

Ou:

 expr "$string" : '$substring' 

onde $substring é uma expressão regular.