
Quero verificar se uma string que foi gravada em uma variável no bash por meio do comando read é uma tupla de dois números. Que eu saiba, isso deveria ser possível com
if [[ "$input" =~ "$regex" ]]; then ...
para uma tupla de dois números, separados por pelo menos um espaço em branco e qualquer número de espaços em branco antes e depois, tentei
$regex="^ *[0-9]+ +[0-9]+ *$"
que deve corresponder
12 123
23 3246543
123 345
34 23
1 234
mas não
123 123 123
1235124
123w123 123
etc.
no entanto, isso não funciona ...
Responder1
POSIXfunção de script shell, usa expansão de parâmetro para obter o primeiro e o segundo número, -eq
é bem-sucedida apenas se houver dois argumentos que sejam o mesmo número (e falha, há menos ou mais argumentos, ou se algum contiver letras) e !=
para verificar se há um espaço . Devoluçõesverdadeirosomente se for uma tupla de dois números:
is_tup() { [ ${1% *} -eq ${1% *} -a \
${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }
Teste:
echo '12 123
23 3246543
123 345
34 23
1 234
123 123 123
1235124
123w123 123' |
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done
Saída:
yes 12 123
yes 23 3246543
yes 123 345
yes 34 23
yes 1 234
no 123 123 123
no 1235124
no 123w123 123