Bash: Cómo usarlo durante el turno; hacer...caso $1 en

Bash: Cómo usarlo durante el turno; hacer...caso $1 en

Estoy trabajando en un script bash y necesito implementar "opciones". ¿Cómo puedo hacer eso con bash?

mi objetivo es ejecutar el script de la siguiente manera: /myscript.sh -d "/var/log/" -c "test"

lo que he probado:

while shift; do
        case $1 in
                -d)
                        shift&&DIR="$1"||die
                ;;
                -c)
                        shift&&COMMAND="$1"||die
                ;;
        esac
done

echo "$DIR"
echo "$COMMAND"

Respuesta1

Para ampliar la respuesta de @choroba, aquí hay un ejemplo de cómo usar getopts:

# parse the flag options (and their arguments)
while getopts c:d: OPT; do
    case "$OPT" in
      d)
        DIR="$OPTARG" ;;
      c)
        COMMAND="$OPTARG" ;;
      [?])
        # got invalid option
        echo "Usage: $0 [-d directory] [-c command]" >&2
        exit 1 ;;
    esac
done

# get rid of the just-finished flag arguments
shift $(($OPTIND-1))

Tenga en cuenta que después de desactivar los argumentos de la bandera, cualquier argumento "normal" permanecerá. Entonces, en ese momento, podrías ocuparte de ellos (por ejemplo ... for arg in "$@"; do ..., ) o, si tu script no los acepta, simplemente quejarte si obtienes alguno ( if [ $# -gt 0 ]; then echo "Usage ...).

Respuesta2

Tu error es que te estás desplazando en la parte superior del bucle, descartando el primer argumento antes de haberlo examinado. Esto es lo que creo que probablemente quisiste decir:

#!/bin/bash
while (( "$#" )); do
   case $1 in
      -d)
         shift&&DIR="$1"||die
         ;;
      -c)
         shift&&COMMAND="$1"||die
         ;;
   esac
   shift
done

echo "$DIR"
echo "$COMMAND"

Respuesta3

Como ya dijo choroba,getoptses un mejor enfoque.

En tu caso, podrías utilizar:

getopts c:d: d || die
DIR=$OPTARG
getopts c:d: c || die
COMMAND=$OPTARG

para lograr lo que estás intentando hacer con el bucle while.

La cadena c:d:especifica los posibles cambios. Los dos puntos significan que el cambio requiere un argumento.

El problema con su enfoque es que llama shiftantes de analizar el primer argumento, descartándolo en el proceso.

Para solucionar este problema, cambie el bucle while a lo siguiente:

while true; do
        case $1 in
                -d)
                        shift&&DIR="$1"||die
                ;;
                -c)
                        shift&&COMMAND="$1"||die
                ;;
        esac
        shift || break
done

Respuesta4

El enfoque habitual es utilizar getopts.

información relacionada