Es un dicho antiguo, pero creo que este principio del inventor de Perl, Larry Wall, sigue siendo cierto:
«Los programadores perezosos reutilizan todo lo que pueden para realizar su trabajo. Esta virtud conduce a la reutilización del código al alentar a que el código se escriba solo una vez».
—Larry Wall, “Las tres virtudes de un programador”
Digamos que te cansas de escribir la misma secuencia de comandos y terminas creando un ingenioso script de shell para ejecutar cosas con menos pulsaciones de teclas.Pero a veces quieres ejecutarlo con diferentes parámetros, De Verdad No quiero copiar tu buen guión. Necesita una forma de proporcionar y usar argumentos desde la línea de comandos. Este artículo cubre exactamente eso.
Tabla de Contenidos
Manejo de entrada de script
Los scripts de shell pueden acceder a algunas variables «mágicas» en el entorno:
$0
– el nombre del guión$1
– el primer parámetro enviado al script$2
– el segundo parámetro enviado al script$3
– el tercer argumento… etc.$#
– el número de parámetros proporcionados$@
– una lista de todos los parámetros proporcionados
#!/bin/bash
if [ $# -eq 0 ];
then
echo "$0: Missing arguments"
exit 1
elif [ $# -gt 2 ];
then
echo "$0: Too many arguments: $@"
exit 1
else
echo "We got some argument(s)"
echo "==========================="
echo "Number of arguments.: $#"
echo "List of arguments...: $@"
echo "Arg #1..............: $1"
echo "Arg #2..............: $2"
echo "==========================="
fi
echo "And then we do something with $1 $2"
Estos son algunos ejemplos de cómo hacer esto con diferentes combinaciones de parámetros:
$ ./ex01.sh
./ex01.sh: Missing arguments
$ ./ex01.sh aa
We got some argument(s)
===========================
Number of arguments.: 1
List of arguments...: aa
Arg #1..............: aa
Arg #2..............:
===========================
And then we do something with aa
$ ./ex01.sh aa bb
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb
Arg #1..............: aa
Arg #2..............: bb
===========================
And then we do something with aa bb
$ ./ex01.sh aa bb cc
./ex01.sh: Too many arguments: aa bb cc
Esto está bien si tiene uno o dos parámetros. Sin embargo, tenga en cuenta que el delimitador predeterminado entre argumentos es el carácter de espacio. Y debido a que el espacio en blanco es el delimitador predeterminado para los argumentos, pueden suceder cosas interesantes. Por ejemplo, esto sucede si usa comillas con más de dos argumentos:
$ ./ex01.sh aa "bb cc xx yy zz"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: aa bb cc xx yy zz
Arg #1..............: aa
Arg #2..............: bb cc xx yy zz
===========================
And then we do something with aa bb cc xx yy zz
Tenga en cuenta que el script explica bb cc xx yy zz
como uno parámetros, ya que los valores están encerrados entre comillas dobles, lo cual también está bien si eso es lo que quieres.
[ Keep your Linux commands close at hand. Download the Advanced Linux commands cheat sheet. ]
Otra cosa interesante es cuando su secuencia de comandos comienza desde variableSi la variable contiene espacios, debe decidir si desea Ese El valor se trata como un solo parámetro o todas las partes se tratan como parámetros diferentes:
$ export AUTHOR="John Lennon"
$ export SONG="Imagine"
$ ./ex01.sh $AUTHOR $SONG
./ex01.sh: Too many arguments: John Lennon Imagine
$ ./ex01.sh "$AUTHOR" "$SONG"
We got some argument(s)
===========================
Number of arguments.: 2
List of arguments...: John Lennon Imagine
Arg #1..............: John Lennon
Arg #2..............: Imagine
===========================
And then we do something with John Lennon Imagine
Cuando envía argumentos como variables sin comillas, el script los interpreta como palabras separadas y «ve» tres argumentos: John, Lennony imagina.
usar comillas Acerca de Estas variables hacen que el script reciba cada variable como argumento, lo que tiene más sentido en este caso.
manejar más parámetros
Como puedes ver, la variable mágica $@
Contiene una lista de todos los parámetros recibidos por el script. Puede usar un bucle para procesar todos los parámetros:
#!/bin/bash
echo "We received $# argument(s)"
for i in "$@"
do
echo "Arg...: $i"
done
Esto te da esto:
$ ./ex02.sh a b c e "stuff with spaces"
We received 5 argument(s)
Arg...: a
Arg...: b
Arg...: c
Arg...: e
Arg...: stuff with spaces
Sé perezoso y vuélvete inteligente
Cuando se trata de argumentos en scripts de shell, es importante entender claramente:
-
¿Qué forma podría tomar el contenido del argumento?
- Si se proporciona como una variable, ¿qué pone el «remitente» en esa variable para usted?
- Si es proporcionado por la entrada del usuario, ¿cómo se asegura de que el usuario no «rompa» su lógica?
- Qué parámetros son aceptables u obligatorios Su ¿texto?
- ¿Qué quieres hacer si el parámetro no es válido? El script puede arrojar un error o usar valores predeterminados.
Espero que esto te ayude a seguir siendo flojo de la manera correcta… mejorando o reutilizando algunos de tus scripts.