Tengo los siguientes comandos en mi script:
set -- `getopt -q agvc:l:t:i: "$@"`
...
while [ -n "$1" ]
do
-i) TIME_GAP_BOOT=$2
shift ;;
...
sleep $TIME_GAP_BOOT
Al invocar el script con -i 2
, me sale el error
sleep: invalid time interval `\'2\''
¿Qué estoy haciendo mal? ¿Cómo le doy formato correctamente al argumento?
Respuesta1
El bash integrado getopts
es mucho más fácil de usar. Si estás usando bash
, deberías usarlo en lugar de getopt
.
GNU getopt
está diseñado para trabajar con argumentos que contienen espacios en blanco y otros metacaracteres. Para hacer eso, produce una cadena de resultado con comillas de estilo bash (o comillas de estilo csh, según la -s
opción). Debe hacer arreglos para que se interpreten las comillas, lo que requiere el uso de eval
. (¿Mencioné que el bash integrado getopts
es mejor?).
El siguiente ejemplo es de la distribución getopt; No tuve nada que ver con eso. (Debería estar presente en algún lugar de su máquina; con ubuntu y debian, aparece como /usr/share/doc/util-linux/examples/getopt-parse.bash
. Sólo estoy citando unas pocas líneas:
# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of getopt.
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
Además de las citas que señala el comentario del ejemplo, es importante mirar el eval
, que generalmente está mal visto.
Por el contrario, el bash incorporado getopts
no requiere eval
y es bastante sencillo; Básicamente emula la llamada a la biblioteca C estándar:
while getopts agvc:l:t:i: opt; do
case "$opt" in
i) TIME_GAP_BOOT=$OPTARG;;
# ...
esac
done