Analisando dígitos separados por vírgulas em ksh

0

Eu tenho uma variável em ksh que não pode conter mais de 2 dígitos separados por vírgulas (espaços em branco permitidos). Algo como:

a="1,2"
a="1 ,2" 
a="1,"
a="0,0"

Eu quero um loop para

  • leia $a
  • sair se houver mais de um ,
  • atribua m=a[1] e n=a[2]
por Jay 09.05.2018 / 18:16

1 resposta

4

for a in "1,2" "1 ,2" "1," "0,0" "0,0,0" "2,3"; do
    case "$a" in
        *,*,*) printf 'Too many commas: "%s"\n' "$a" >&2
               exit 1
    esac
    IFS=', ' read m n <<<"$a"
    printf 'm = %d, n = %d\n' "$m" "$n"
done

Isso produz

m = 1, n = 2
m = 1, n = 2
m = 1, n = 0
m = 0, n = 0
Too many commas: "0,0,0"

quando executado em ksh93 (ou bash ou zsh ).

Definir IFS para um espaço e uma vírgula antes de read tornar read dividir o conteúdo de $a nesses dois caracteres (ou vários deles). Os dados restantes são atribuídos a m e n .

Se uma string for algo como "2,3 4" , então n receberia o valor 3 4 .

Observe também que na terceira linha de saída (parsing "1," ), m é mostrado como zero apenas porque estamos usando o especificador de formato %d com printf . Se interpretada como uma string, a variável m está vazia.

    
por 09.05.2018 / 18:27