Quiero que mi script pueda tomar una entrada opcional,
por ejemplo, actualmente mi script es
#!/bin/bash
somecommand foo
pero me gustaría que dijera:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Quiero que mi script pueda tomar una entrada opcional,
por ejemplo, actualmente mi script es
#!/bin/bash
somecommand foo
pero me gustaría que dijera:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Respuestas:
Puede usar la sintaxis de valor predeterminado:
somecommand ${1:-foo}
Lo anterior, como se describe en el Manual de referencia de Bash - 3.5.3 Expansión del parámetro Shell [énfasis mío]:
Si el parámetro no está establecido o es nulo , la expansión de la palabra se sustituye. De lo contrario, el valor del parámetro se sustituye.
Si solo desea sustituir un valor predeterminado si el parámetro no está establecido (pero no si es nulo, por ejemplo, si es una cadena vacía), utilice esta sintaxis en su lugar:
somecommand ${1-foo}
Nuevamente del Manual de referencia de Bash - 3.5.3 Expansión del parámetro Shell :
Omitir los dos puntos da como resultado una prueba solo para un parámetro que no está establecido. Dicho de otra manera, si se incluyen los dos puntos, el operador comprueba la existencia de ambos parámetros y que su valor no es nulo; si se omiten los dos puntos, el operador solo prueba la existencia.
foo
si no $1
está configurado o una cadena vacía " y ${1-foo}
"devolver foo
si no $1
está configurado".
Puede establecer un valor predeterminado para una variable así:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Aquí hay algunos ejemplos de cómo funciona esto:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
me confundió (¿se niega?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
es el mismo que ! -z
.
-n
y ! -z
así que diría que no es el caso aquí.
[ -n $1 ]
siempre será cierto . Si usa bash, [[ -n $1 ]]
se comportará como espera, de lo contrario debe citarlo[ -n "$1" ]
por favor no olvides, si su variable $ 1 .. $ n necesitas escribir en una variable regular para usar la sustitución
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Para argumentos múltiples opcionales , por analogía con el ls
comando que puede tomar uno o más archivos o, por defecto, enumera todo en el directorio actual:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
No funciona correctamente para archivos con espacios en la ruta, por desgracia. Todavía no he descubierto cómo hacer que eso funcione.
Es posible utilizar la sustitución de variables para sustituir un valor fijo o un comando (como date
) para un argumento. Las respuestas hasta ahora se han centrado en valores fijos, pero esto es lo que solía hacer de la fecha un argumento opcional:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY