¿Cómo soluciono el argumento recibido de getopt?

¿Cómo soluciono el argumento recibido de getopt?

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 getoptses mucho más fácil de usar. Si estás usando bash, deberías usarlo en lugar de getopt.

GNU getoptestá 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 -sopción). Debe hacer arreglos para que se interpreten las comillas, lo que requiere el uso de eval. (¿Mencioné que el bash integrado getoptses 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 getoptsno requiere evaly 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

información relacionada