Los argumentos pueden ser útiles, ¡especialmente con Bash!
Hasta ahora, ha aprendido a usar variables para hacer que sus scripts de bash sean dinámicos y genéricos, de modo que respondan a varios datos y diferentes entradas de usuarios.
En este tutorial, aprenderá cómo puede pasar variables a scripts bash desde la línea de comandos.
Compre el libro electrónico 'Aprender Bash rápidamente'Pasar argumento a un script de shell bash
El siguiente script count_lines.sh
#!/bin/bash
echo -n "Please enter a filename: "
read filename
nlines=$(wc -l < $filename)
echo "There are $nlines lines in $filename"
Por ejemplo, el usuario puede ingresar el archivo /etc/passwd
Este script funciona bien; sin embargo, ¡hay una alternativa mucho mejor!
En lugar de pedirle al usuario el nombre del archivo, podemos hacer que el usuario simplemente pase el nombre del archivo como argumento de la línea de comando mientras ejecuta el script de la siguiente manera:
./count_lines.sh /etc/passwd
Se puede acceder al primer argumento bash (también conocido como parámetro posicional) dentro de su script bash usando el $1
variables.
Entonces, en el script count_lines.sh, puede reemplazar la variable de nombre de archivo con $1
de la siguiente manera:
#!/bin/bash
nlines=$(wc -l < $1)
echo "There are $nlines lines in $1"
Tenga en cuenta que también me deshice de los comandos de lectura y primer eco, ya que ya no son necesarios.
Finalmente, puede ejecutar el script y pasar cualquier archivo como argumento:
./count_lines.sh /etc/group
There are 73 lines in /etc/group
Pasar múltiples argumentos a un script de shell bash
Puede pasar más de un argumento a su script bash. En general, aquí está la sintaxis de pasar múltiples argumentos a cualquier script bash:
script.sh arg1 arg2 arg3 …
El segundo argumento será referenciado por $2
variable, el tercer argumento es referenciado por $3
, .. etc.
El $0
¡la variable contiene el nombre de su script bash en caso de que se lo pregunte!
Ahora podemos editar nuestro count_lines.sh
#!/bin/bash
n1=$(wc -l < $1)
n2=$(wc -l < $2)
n3=$(wc -l < $3)
echo "There are $n1 lines in $1"
echo "There are $n2 lines in $2"
echo "There are $n3 lines in $3"
Ahora puede ejecutar el script y pasar tres archivos como argumentos al script bash:
Como puede ver, el script genera el número de líneas de cada uno de los tres archivos; y no hace falta decir que el orden de los argumentos importa, por supuesto.
Ser creativo con argumentos en Bash shell
Hay un montón de comandos de Linux por ahí.
Algunos de ellos son un poco complicados, ya que pueden tener una sintaxis larga o una gran variedad de opciones que puede usar.
¡Afortunadamente, puede usar argumentos bash para convertir un comando difícil en una tarea bastante fácil!
Para demostrarlo, eche un vistazo al siguiente find.sh
#!/bin/bash
find / -iname $1 2> /dev/null
¡Es un script muy simple que, sin embargo, puede resultar muy útil! Puede proporcionar cualquier nombre de archivo como argumento para el script y mostrará la ubicación de su archivo:
¡Ves cómo esto ahora es mucho más fácil que escribir todo el comando de búsqueda! Esta es una prueba de que puede usar argumentos para convertir cualquier comando largo y complicado en Linux en un simple script bash.
Si te estás preguntando sobre el 2> /dev/null
, significa que cualquier mensaje de error (como que no se puede acceder al archivo) no se mostrará en la pantalla. Sugiero leer sobre la redirección de stderr en Linux para obtener más conocimiento sobre este tema.
Consejo extra:Variables especiales en Bash shell
Bash tiene muchas variables especiales integradas que son muy útiles y están disponibles a su disposición.
La siguiente tabla destaca las variables bash integradas especiales más comunes:
Variable especial | Descripción |
---|---|
$0 | El nombre del script bash. |
$1, $2...$n | Los argumentos del script bash. |
$$ | La identificación del proceso del shell actual. |
$# | El número total de argumentos pasados al script. |
[email protected] | El valor de todos los argumentos pasados al script. |
$? | El estado de salida del último comando ejecutado. |
$! | La identificación del proceso del último comando ejecutado. |