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.