No seu primeiro caso, os argumentos passados para count_args
foram interpretados pelo shell, o shell viu duas palavras --options
e 1 2
então passou para count_args
.
Com o segundo caso, entre aspas duplas, todos os caracteres, exceto $
e \
, são tratados como literais. É muito tarde para o shell interpretar as aspas simples, o shell viu o conteúdo de $ARGS
variable como uma longa string --options '1 2'
, todos os caracteres como literais e não têm significado especial para o shell.
O uso de ${ARGS}
sem aspas duplas fez com que ele fosse submetido à divisão de campos e à expansão de nomes de arquivos. Com o valor padrão de IFS
, você tem três palavras separadas: --options
, '1
e 2'
.
A melhor maneira de arquivar isso é usar "$@"
:
#!/bin/sh
set -- --options '1 2'
./count_args "$@"