
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 shift
antes 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
.