Tengo un script count_args
que cuenta argumentos:
#!/bin/sh
echo $#
Si lo llamo con estas opciones, me dice que obtiene dos argumentos:
$ ./count_args --options '1 2'
2
Pero si construyo los argumentos en un script test_args
así:
#!/bin/sh
ARGS="--options '1 2'"
./count_args ${ARGS}
... me sale el resultado:
$ ./test_args
3
¿Por qué el '1 2'
ser está dividido en el guión? ¿Cómo puedo evitar esto de forma compatible con POSIX?del script de llamada? ¿Es posible seguir almacenando argumentos en variables de alguna manera para poder separarlos en scripts más complejos (por ejemplo, tener ARGS_1
y ARGS_2
)?
Tenga en cuenta que mi /bin/sh
es dash
.
Respuesta1
En su primer caso, los argumentos pasados count_args
fueron interpretados por el shell, el shell vio dos palabras --options
y 1 2
luego se las pasó a count_args
.
En el segundo caso, entre comillas dobles, todos los caracteres excepto $
y \
se tratan como literales. Es demasiado tarde para que el shell interprete las comillas simples, el shell vio el contenido de $ARGS
la variable como una cadena larga --options '1 2'
, todos los caracteres son literales y no tienen ningún significado especial para el shell.
El uso ${ARGS}
sin comillas dobles lo hacía sujeto a la división de campos y la expansión del nombre de archivo. Con el valor predeterminado de IFS
, tienes tres palabras separadas --options
: '1
y 2'
.
La mejor manera de archivar esto es usando "$@"
:
#!/bin/sh
set -- --options '1 2'
./count_args "$@"