9 ejemplos de secuencias de comandos Bash para comenzar en Linux

Si está comenzando con las secuencias de comandos de Bash en Linux, obtener una comprensión sólida de los conceptos básicos le resultará muy útil. Son la base de un conocimiento más profundo y habilidades de secuencias de comandos superiores.

Recuerde, haga sus scripts ejecutables

Para que el shell ejecute una secuencia de comandos, la secuencia de comandos debe tener establecido el permiso de archivo ejecutable. Sin esto, su secuencia de comandos es solo un archivo de texto. Con él, sigue siendo un archivo de texto, pero el shell sabe que contiene instrucciones e intentará ejecutarlas cuando se inicie el script.

El objetivo de escribir scripts es que se ejecuten, por lo que el primer paso básico es saber cómo hacer que Linux sepa que su script debe considerarse ejecutable.

los chmod El comando nos permite establecer permisos de archivo. El permiso de ejecución se puede configurar con el indicador +x.

                      chmod +x script1.sh
                    

Deberá hacer esto con cada uno de sus scripts. Reemplace “script1.sh” con el nombre de su script.

1. ¿Qué es esa extraña primera línea?

La primera línea de un script le dice al shell a qué intérprete se debe llamar para ejecutar ese script. La primera línea debe comenzar con un shebang, “#!”, también conocido como hashbang. Los “#!” le dice al shell que esta línea contiene la ruta y el nombre del intérprete para el que se escribió el script.

Esto es importante porque si ha escrito un script para que se ejecute en Bash, no querrá que lo interprete un shell diferente. Es probable que haya incompatibilidades. Bash, como la mayoría de los shells, tiene sus propias peculiaridades de sintaxis y funcionalidad que otros shells no tendrán, o se implementarán de manera diferente.

Cuando ejecuta una secuencia de comandos, el shell actual abre la secuencia de comandos y determina qué shell o intérprete debe usarse para ejecutar esa secuencia de comandos. Luego lanza ese shell y le pasa el script.

                      #!/bin/bash

echo Running in $SHELL
                    

La primera línea de este script se puede leer como “Usar el intérprete ubicado en /bin/bash para ejecutar este script.”

La única línea en el script escribe el valor contenido en el $SHELL variable ambiental a la pantalla del terminal. Esto confirma que se usó Bash para ejecutar el script.

                      ./script1.sh
                    

Identificar el shell bajo el que se ejecuta un script

Como un pequeño truco de salón, podemos demostrar que el script se pasa a cualquier intérprete que seleccionemos.

                      #!/bin/cat
All the lines of text are passed to the cat command
and are printed in the terminal window. That includes
the shebang line.
                    
                      script2.sh
                    

Ejecutar un script pasándolo al comando cat

Este script es lanzado por el shell actual y pasado al cat dominio. los cat comando “ejecuta” el script.

Escribir sus shebangs de esta manera supone que sabe dónde se encuentra el shell u otro intérprete en la máquina de destino. Y el 99% del tiempo, eso está bien. Pero a algunas personas les gusta cubrir sus apuestas y escribir sus travesuras así:

                      #!/usr/bin/env bash

echo Running in $SHELL
                    
                      script3.sh
                    

Ejecutando un script que busca el shell

Cuando se inicia el script, el shell busca la ubicación del shell nombrado. Si el shell se encuentra en una ubicación no estándar, este tipo de enfoque puede evitar errores de “mal intérprete”.

¡No escuches, está mintiendo!

En Linux, siempre hay más de una forma de despellejar a un gato o demostrar que un autor está equivocado. Para ser completamente fáctico, hay una manera de ejecutar scripts sin problemas y sin hacerlos ejecutables.

Si inicia el shell en el que desea ejecutar el script y pasa el script como un parámetro de línea de comando, el shell iniciará y ejecutará el script, ya sea ejecutable o no. Debido a que elige el shell en la línea de comando, no hay necesidad de un tinglado.

Este es el guión completo:

                      echo "I've been executed by" $SHELL
                    

usaremos ls para ver que el script realmente no es ejecutable e inicie Bash con el nombre del script:

                      ls
                    
                      bash script4.sh
                    

Ejecutar un script que no tiene el conjunto de permisos de archivo ejecutable y no tiene un tinglado

También hay una manera de hacer que el shell actual ejecute un script, no un shell lanzado específicamente para ejecutar el script. Si usas el source comando, que se puede abreviar a un solo punto “ . “, su script es ejecutado por su shell actual.

Por lo tanto, para ejecutar una secuencia de comandos sin un shebang, sin el permiso del archivo ejecutable y sin iniciar otro shell, puede usar cualquiera de estos comandos:

                      source script4.sh
                    
                      . script4.sh
                    

Ejecutar un script en el shell actual

Aunque esto es posible, no se recomienda como solución general. Hay inconvenientes.

Si un script no contiene un shebang, no puede saber para qué shell se escribió. ¿Te vas a acordar dentro de un año? Y sin el permiso ejecutable establecido en el script, el ls El comando no lo identificará como un archivo ejecutable, ni utilizará colores para distinguir el script de los archivos de texto sin formato.

Líneas de comando: ¿Por qué la gente todavía se molesta con ellas?

2. Impresión de texto

Escribir texto en el terminal es un requisito común. Un poco de retroalimentación visual ayuda mucho.

Para mensajes simples, el echo el comando será suficiente. Permite dar formato al texto y también te permite trabajar con variables.

                      #!/bin/bash

echo This is a simple string.
echo "This is a string containing 'single quotes' so it's wrapped in double quotes."
echo "This prints the user name:" $USER
echo -e "The -e option lets us usenformatting directivesnto split the string."
                    
                      ./script5.sh
                    

Un script que usa el comando echo para escribir en la ventana del terminal

los printf El comando nos brinda más flexibilidad y mejores capacidades de formato, incluida la conversión de números.

Este script imprime el mismo número usando tres bases numéricas diferentes. La versión hexadecimal también está formateada para imprimirse en mayúsculas, con ceros a la izquierda y un ancho de tres dígitos.

                      #!/bin/bash

printf "Decimal: %d, Octal: %o, Hexadecimal: %03Xn" 32 32 32
                    
                      ./script6.sh
                    

Un script que usa printf para convertir y formatear números

Tenga en cuenta que a diferencia de echo debes decir printf para comenzar una nueva línea con el “ n ” ficha.

3. Creación y uso de variables

Las variables le permiten almacenar valores dentro de su programa y manipularlos y usarlos. Puede crear sus propias variables o usar variables de entorno para los valores del sistema.

                      #!/bin/bash

millennium_text="Years since the millennium:"

current_time=$( date '+%H:%M:%S' )
todays_date=$( date '+%F' )
year=$( date '+%Y' )

echo "Current time:" $current_time
echo "Today's date:" $todays_date

years_since_Y2K=$(( year - 2000 ))

echo $millennium_text $years_since_Y2K
                    

Este script crea una variable de cadena llamada millennium_text . Contiene una línea de texto.

A continuación, crea tres variables numéricas.

  • los current_time La variable se inicializa en el momento en que se ejecuta el script.
  • los todays_date variable se establece en la fecha en la que se ejecuta el script.
  • los year variable contiene el año en curso.

Para acceder al valor almacenado en una variable, preceda su nombre con un signo de dólar “$”.

                      ./script7.sh
                    

Un script que usa variables para calcular períodos de tiempo

El script imprime la hora y la fecha, luego calcula cuántos años han pasado desde el milenio y lo almacena en el years_since_Y2K variable.

Finalmente, imprime la cadena contenida en el millennium_text variable y el valor numérico almacenado en el years_since_Y2K .

Cómo trabajar con variables en Bash

4. Manejo de la entrada del usuario

Para permitir que un usuario ingrese un valor que usará el script, debe poder capturar la entrada del teclado del usuario. la fiesta read El comando te permite hacer precisamente eso. Aquí hay un sencillo example.

                      #!/bin/bash

echo "Enter a number and hit "Enter""
read user_number1;
echo "Enter another number and hit "Enter""
read user_number2;

printf "You entered: %d and %dn" $user_number1 $user_number2
printf "Added together they make: %dn" $(( user_number1 + user_number2))
                    

El script solicita dos números. Se leen desde el teclado y se almacenan en dos variables, user_number1 y user_number2 .

El script imprime los números en la ventana del terminal, los suma e imprime el total.

                      ./script8.sh
                    

Captura de la entrada del usuario con el comando de lectura

Podemos combinar las indicaciones en el read comandos usando el -p (solicitud) opción.

                      #!/bin/bash

read -p "Enter a number and hit "Enter" " user_number1;
read -p "Enter another number and hit "Enter" " user_number2;

printf "You entered: %d and %dn" $user_number1 $user_number2
printf "Added together they make: %dn" $(( user_number1 + user_number2))
                    

Esto hace que las cosas sean más claras y fáciles de leer. Los scripts que son fáciles de leer también son más fáciles de depurar.

                      ./script9.sh
                    

Capturar la entrada del usuario con el comando de lectura y la opción -p (prompt)

El script se comporta de forma ligeramente diferente ahora. La entrada del usuario está en la misma línea que el aviso.

Para capturar la entrada del teclado sin que se repita en la ventana del terminal, use el -s opción (silencioso).

                      #!/bin/bash

read -s -p "Enter your secret PIN and hit "Enter" " secret_PIN;

printf "nShhh ... it is %dn" $secret_PIN
                    
                      ./script10.sh
                    

Capturar la entrada del usuario sin escribirla en la ventana del terminal

El valor de entrada es capturado y almacenado en una variable llamada secret_PIN , pero no se repite en la pantalla cuando el usuario lo escribe. Lo que hagas con él después de eso depende de ti.

5. Aceptar parámetros

A veces es más conveniente aceptar la entrada del usuario como parámetros de la línea de comandos que tener un script esperando la entrada. Pasar valores a un script es fácil. Se pueden referenciar dentro del script como si fueran cualquier otra variable.

El primer parámetro se convierte en variable. $1 el segundo parámetro se vuelve variable $2 , y así. Variable $0 siempre contiene el nombre del script y la variable $# contiene el número de parámetros que se proporcionaron en la línea de comando. Variable [email protected] es una cadena que contiene todos los parámetros de la línea de comandos.

                      #!/bin/bash

printf "This script is called: %sn" $0
printf "You used %d command line parametersn" $#

# loop through the variables
for param in "[email protected]"; do
  echo "$param"
done

echo "Parameter 2 was:" $2
                    

Este guión utiliza $0 y $# para imprimir alguna información. luego usa [email protected] para recorrer todos los parámetros de la línea de comandos. Usa $2 para mostrar cómo acceder a un único valor de parámetro en particular.

                      ./script11.sh
                    

Uso de parámetros de línea de comando con un script

Envolver varias palabras entre comillas “”” las combina en un solo parámetro.

6. Lectura de datos de archivos

Saber cómo leer datos de un archivo es una gran habilidad para tener. Podemos hacer esto en Bash con un ciclo while.

                      #!/bin/bash

LineCount=0

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

  ((LineCount++))
  echo "Reading line $LineCount: ${LinefromFile}"

done < "$1"
                    

Estamos pasando el nombre del archivo que queremos que el script procese como un parámetro de línea de comando. Será el único parámetro, por lo que dentro del script $1 contendrá el nombre del archivo. Estamos redirigiendo ese archivo a la while círculo.

los while loop establece el separador de campo interno en una cadena vacía, usando el IFS='' asignación. Esto previene el read Comando de dividir líneas en espacios en blanco. Solo el retorno de carro al final de una línea se considera el verdadero final de la línea.

los [[ -n "${LinefromFile}" ]] La cláusula contempla la posibilidad de que la última línea del archivo no termine con un retorno de carro. Incluso si no es así, esa última línea se manejará correctamente y se tratará como una línea regular compatible con POSIX.

                      ./script12.sh twinkle.txt
                    

Leer texto de un archivo con un script

7. Uso de pruebas condicionales

Si desea que su secuencia de comandos realice diferentes acciones para diferentes condiciones, debe realizar pruebas condicionales. La sintaxis de prueba de doble paréntesis ofrece, al principio, una abrumadora cantidad de opciones.

                      #!/bin/bash

price=$1

if [[ price -ge 15 ]];
then
  echo "Too expensive."
else
  echo "Buy it!"
fi
                    

Bash proporciona un conjunto completo de operadores de comparación que le permiten determinar cosas como si existe un archivo, si puede leerlo, si puede escribir en él y si existe un directorio.

También dispone de pruebas numéricas para iguales -qe mas grande que -gt menor o igual -le y así sucesivamente, aunque también puedes usar el conocido == , >= , <= notación.

                      ./script13.sh 13
                    
                      ./script13.sh 14
                    
                      ./script13.sh 15
                    
                      ./script13.sh 16
                    

Ejecutar un script con una prueba condicional

8. El poder de los bucles for

La repetición de acciones una y otra vez se logra mejor usando bucles. A for loop te permite ejecutar un bucle varias veces. Esto podría ser hasta un número en particular, o podría ser hasta que el ciclo haya recorrido una lista de elementos.

                      #!/bin/bash

for (( i=0; i<=$1; i++ ))
do
  echo "C-style for loop:" $i
done

for i in {1..4}
do
  echo "For loop with a range:" $i
done

for i in "zero" "one" "two" "three"
do
  echo "For loop with a list of words:" $i
done

website="How To Geek"

for i in $website
do
  echo "For loop with a collection of words:" $i
done
                    

Todos estos bucles son for bucles, pero están trabajando con diferentes tipos de declaraciones y datos de bucle.

                      ./script14.sh 3
                    

Ejecutar un script con cuatro tipos diferentes de bucle for

El primer bucle es un estilo C clásico. for círculo. El contador de bucles i se inicializa a cero y se incrementa con cada ciclo del ciclo. Mientras que el valor de i es menor o igual al valor que se tiene en $1 el ciclo continuará ejecutándose.

El segundo ciclo funciona a través del rango de números del 1 al 4. El tercer ciclo funciona a través de una lista de palabras. Si bien hay más palabras para procesar, el bucle sigue repitiéndose.

El último ciclo funciona a través de la lista de palabras en una variable de cadena.

9. Funciones

Las funciones le permiten encapsular secciones de código en rutinas con nombre que se pueden llamar desde cualquier lugar dentro de su secuencia de comandos.

Supongamos que queremos que nuestro script que lee líneas de un archivo haga algún tipo de procesamiento en cada línea. Sería conveniente tener ese código contenido dentro de una función.

                      #!/bin/bash

LineCount=0

function count_words() {
  printf "%d words in line %dn" $(echo $1 | wc -w) $2
}

while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do

  ((LineCount++))
  count_words "$LinefromFile" $LineCount

done < "$1"

count_words "This isn't in the loop" 99
                    

Hemos modificado nuestro programa de lectura de archivos agregando una función llamada count_words . Se define antes de que necesitemos usarlo.

La definición de la función comienza con la palabra function . A esto le sigue un nombre único para nuestra función seguido de paréntesis “ () .” El cuerpo de la función está contenido entre corchetes “{}”.

La definición de la función no hace que se ejecute ningún código. No se ejecuta nada en la función hasta que se llama a la función.

los count_words La función imprime el número de palabras en una línea de texto y el número de línea. Estos dos parámetros se pasan a la función al igual que los parámetros se pasan a un script. El primer parámetro se convierte en variable de función. $1 y el segundo parámetro se convierte en variable de función $2 y así.

los while loop lee cada línea del archivo y la pasa al count_words función, junto con el número de línea. Y solo para mostrar que podemos llamar a la función desde diferentes lugares dentro del script, la llamamos una vez más fuera del while círculo.

                      ./script15.sh twinkle.txt
                    

Ejecutar un script que usa una función

No temas la curva de aprendizaje

La secuencia de comandos es gratificante y útil, pero difícil de aprender. Una vez que obtenga algunas técnicas reutilizables bajo su cinturón, podrá escribir guiones que valgan la pena con relativa facilidad. Luego puede buscar una funcionalidad más avanzada.

Camine antes de poder correr y tómese el tiempo para disfrutar del viaje.

10 comandos básicos de Linux para principiantes

Related Posts