Bash Script: qué es, cómo escribir uno y ejemplos

Si alguna vez has utilizado un sistema operativo Linux, como la mayoría de los VPS (servidores privados virtuales), es posible que hayas oído hablar de bash. Este es un intérprete Unix que lee y ejecuta varios comandos.

Cuando necesites ejecutar varios comandos bash, no tienes que ejecutarlos manualmente de uno en uno. En su lugar, es posible crear un archivo de script que contenga funciones bash para ejecutar esos comandos.

Puede parecer complicado, pero aprendiendo sus fundamentos, entenderás el lenguaje de script bash y descubrirás cómo puede ayudarte en tu flujo de trabajo.

Este artículo cubrirá el proceso de script bash. Repasaremos todo, desde los comandos bash, hasta la ejecución de un programa bash en un terminal Linux.

¿Qué es Bash?

Bash (Bourne-Again Shell) es un intérprete de comandos de Unix. Este lee los comandos del shell e interactúa con el sistema operativo para ejecutarlos.

Para entender completamente el scripting shell bash, necesitas conocer dos conceptos: shell y scripting.

Shell es un macroprocesador que utiliza comandos para interactuar con el sistema operativo. Esto significa que puede recuperar, procesar y almacenar información en un ordenador.

Por su parte, el scripting es el proceso de compilar comandos del shell en un nuevo archivo utilizando un editor de texto.

Cuando escribes bash en un editor de texto, estás compilando comandos bash o funciones bash, los cuales son un conjunto de comandos que pueden ser llamados numerosas veces tan solo usando el nombre de la función. El texto se guarda entonces como un archivo de script bash ejecutable con la extensión .sh

¿Por qué usar Bash Script?

Los scripts Bash pueden ayudarte con tu flujo de trabajo, ya que compilan muchos comandos largos en un único archivo de script ejecutable.

Por ejemplo, si tienes múltiples comandos que tienes que ejecutar en un intervalo de tiempo específico, puedes compilar un script bash, en lugar de escribir y ejecutar los comandos manualmente uno por uno. Sólo tendrás que ejecutar el archivo de script cuando sea necesario.

Aquí otras ventajas de utilizar scripts bash:

  • Comandos bien estructurados. Estructura los comandos en una secuencia para que cada vez que ejecutes el script, se ejecute en el orden correcto.
  • Automatización de tareas. Automatiza la ejecución de secuencias de comandos en cualquier momento definido mediante el programador cron basado en el tiempo.
  • Transparencia. La gente puede comprobar el contenido de un script ya que está en un archivo de texto legible. Sin embargo, si ejecutas los comandos utilizando otro programa escrito en un lenguaje de programación diferente, como C++, tendrás que acceder al código fuente.
  • Transferible. Si transfieres un script a otras distribuciones de Linux, seguirá funcionando, siempre que los comandos del shell estén disponibles en ese sistema operativo específico.

Consejo profesional

Linux tiene un manual de comandos de shell bash. Este contiene descripciones de todos los términos técnicos y variables estándar del shell. Escribe y ejecuta el comando man bash para mostrar el manual en el terminal.

Comandos Bash

Bash está disponible en casi todos los tipos de sistemas operativos basados en Unix y no requiere una instalación independiente. Necesitarás una línea de comandos Linux, también conocida como terminal Linux. Este es un programa que contiene el shell y te permite ejecutar scripts bash. 

Utiliza este comando para comprobar la lista de shells disponibles en tu sistema operativo Unix:

cat /etc/shells

La salida debería mostrar una lista como ésta:

/bin/bash
/bin/sh
/bin/tcsh
/bin/csh

Cada script de shell Bash debe comenzar con #! seguido de la ruta absoluta al intérprete bash. Para ver la ruta, introduce este comando:

which bash

Debería producir el siguiente resultado:

/bin/bash

Esta es la ruta estándar al intérprete bash en la mayoría de los sistemas operativos Unix. Para que el shell sepa que debe ejecutar comandos utilizando el intérprete bash, inicia el script con esta línea:

#!/bin/bash

¡Importante! Si deseas ejecutar scripts bash en un servidor privado virtual, conéctate a él a través de un cliente SSH.

El siguiente paso es escribir y compilar los comandos en un archivo .sh utilizando un editor de texto. Necesitarás un editor de texto Unix como VIM o GNU Nano. En este tutorial, usaremos el editor de texto Nano para crear el archivo introduciendo este comando:

nano function.sh

Esto abrirá un nuevo archivo .sh para que lo edites. Comienza escribiendo #!/bin/bash seguido de los comandos bash.

¡Importante! Cuando hayas terminado de utilizar el editor de texto Nano, pulsa Ctrl+X para cerrarlo y, a continuación, pulsa Y e Intro para guardar los cambios.

Comandos Bash básicos para tu primer script bash

Para crear con éxito tu primer bash script, necesitas entender los comandos bash esenciales. Estos son los elementos principales de un script y debes saber lo que hacen y cómo escribirlos correctamente.

Hay muchos comandos bash en Linux. Para empezar, vamos a cubrir siete básicos.

1. Comentarios

Los comentarios ofrecen una descripción de determinadas líneas del script. El terminal no analiza los comentarios durante la ejecución, por lo que no afectarán a la salida.

Hay dos formas de añadir comentarios a un script. El primer método consiste en escribir # al principio de un comentario de una sola línea.

#!/bin/bash
#Command below prints a Hola mundo text
echo “¡Hola, mundo!”

El segundo método consiste en utilizar : seguido de . Este método funciona para comentarios de varias líneas.

#!/bin/bash
read a
: ‘ 
The following commands prints
¡Hola, mundo!
‘
echo “¡Hola, mundo!”

2. Variables

Las variables son símbolos que representan un carácter, cadenas de caracteres o números. Basta con escribir el nombre de la variable en una línea de órdenes para utilizar las cadenas o números definidos.

Para asignar una variable, escribe el nombre de la variable y el valor de la cadena como aquí:

testvar="Esta es una variable de prueba"

En este caso, testvar es el nombre de la variable, y Esta es una variable de prueba es el valor de la cadena. Al asignar una variable, recomendamos utilizar un nombre de variable que sea fácil de recordar y que represente su valor.

Para leer el valor de la variable en la línea de comandos, utiliza el símbolo $ antes del nombre de la variable. Echa un vistazo al siguiente ejemplo:

#!/bin/bash
testvar="Esta es una variable de prueba"
echo $testvar

La segunda línea de comando utiliza echo para imprimir el valor de testvar. La salida de ese script será:

Esta es una variable de prueba

Veamos cómo introducir un valor de cadena mediante el comando read y hacer que el script compare dos valores de cadena de variables diferentes:

#!/bin/bash
echo "Introduce un número" 
read a #The user input in this command line will be stored as variable a
b=50 #The value of variable b
if [[$a -eq $b]]
then
echo "Mismo número"
else
echo "Número diferente"
fi

La salida de ese script debería ser la siguiente:

Introduce un número
20
Número diferente

Observa que la línea 3 es el valor que se convierte en la variable a.

El script compara la variable a con el valor 20 y la variable b con el valor 50. Como los valores son diferentes, el script imprime Número diferente.

Sin embargo, si el usuario introduce 50, ésta será la salida:

Introduce un número
50
Mismo número

Este ejemplo también utiliza sentencias condicionales, de las que hablaremos más adelante.

3. Comando echo

echo es un comando muy conocido y utilizado en muchos lenguajes de programación. Hay varias opciones que puedes utilizar con echo para imprimir la salida en el terminal.

El primer uso de echo, y el más común, es la salida de texto estándar:

#!/bin/bash
echo "¡Hola, mundo!"

La salida de ese comando es ¡Hola, mundo! Por defecto, cuando se utiliza el comando echo de esta forma, el terminal introducirá una nueva línea debajo. Si quieres utilizar echo para una salida sin una nueva línea, puedes hacerlo usando -n.

#!/bin/bash
echo -n "¡Hola, mundo!"

Utiliza la opción \n para introducir un salto de línea en la salida. Para activar la barra invertida (\), debes incluir -e.

#!/bin/bash
echo -e "¡Hola, \nmundo!"

La salida de ese comando tendrá el siguiente aspecto:

¡Hola,
mundo!

La opción \t añade un espacio de tabulación horizontal:

#!/bin/bash
echo -e "¡Hola, mundo!"

La salida de este comando moverá el texto a la derecha:

                                                                ¡Hola, mundo!

También puedes combinar varias opciones. Por ejemplo, combina \n y \t para dividir el texto en líneas y ubicarlo a la derecha:

#!/bin/bash
echo -e “\n\t¡Hola, \n\tmundo!”

La salida de ese comando tendrá el siguiente aspecto:

                                                                      ¡Hola,
                                                                       mundo!

4. Funciones

Una función compila un conjunto de comandos en un grupo. Si necesitas volver a ejecutar el comando, simplemente escribe la función en lugar del conjunto completo de comandos.

Hay varias formas de escribir funciones.

La primera forma es empezar con el nombre de la función y seguirlo con paréntesis y corchetes:

function_name () {
first command
second command
}

También puedes escribirlo en una sola línea:

function_name () { first command; second command; }

El segundo método para escribir una función es utilizar la palabra reservada function seguida del nombre de la función. Esto elimina la necesidad de paréntesis:

function function_name {
first command
second command
}

Este método también tiene una versión de una sola línea:

function function_name { first command; second command; }

Por ejemplo, podemos escribir dos funciones con varios comandos echo:

#!/bin/bash
hola_mundo () {
echo “¡Hola, mundo!”
echo “Esta es una variable de prueba”
}
print_message () {
echo “Aprendamos programación Bash”
echo “Disfruta este tutorial”
}

Ten en cuenta que escribir las funciones como en el ejemplo anterior sólo las define y no ejecuta los comandos contenidos. Para ejecutar una función, introduce su nombre en la línea de comandos.

Ahora, usemos los dos ejemplos anteriores en una función bash completa, incluyendo su ejecución:

#!/bin/bash
#Define a hola mundo function
hola_mundo () {
echo “¡Hola, mundo!”
echo “Esta es una variable de prueba”
}
#Define a print message function
print_message () {
echo “Aprendamos programación Bash”
echo “Disfruta este tutorial”
}
#Execute the hello world function
hola_mundo
#Execute the print message function
print_message

Este es el resultado del script anterior:

¡Hola, mundo!
Esta es una variable de prueba
Aprendamos programación Bash
Disfruta este tutorial

5. Bucles

Los comandos bash de bucle son útiles si deseas ejecutar comandos varias veces. Hay tres tipos de ellos que se pueden ejecutar en bash: for, while y until.

El bucle for ejecuta el comando para una lista de elementos:

#!/bin/bash
for item in [lista]
do
[comandos]
done

El siguiente ejemplo utiliza un bucle for para imprimir todos los días de la semana:

#!/bin/bash
for days in Lunes Martes Miércoles Jueves Viernes Sábado Domingo
do
echo “Day: $days”
done

En la línea 2, “days” se convierte automáticamente en una variable, cuyos valores son los nombres de los siguientes días. Luego, en el comando echo, utilizamos el símbolo $ para llamar a los valores de la variable.

La salida de ese script será la siguiente:

Day: Lunes
Day: Martes
Day: Miércoles
Day: Jueves
Day: Viernes
Day: Sábado
Day: Domingo

Observa que incluso con una sola línea de comando en el script de bucle, imprime siete salidas de echo.

El siguiente tipo de bucle es while. El script evaluará una condición. Si la condición es verdadera, seguirá ejecutando los comandos hasta que la salida ya no cumpla la condición definida.

#!/bin/bash
while [condición]
do
[comandos]
done

Veamos un ejemplo sencillo en el que intervienen una variable y un operador de incremento, denominado ((++)):

#!/bin/bash
i=0
while [ $i -le 5 ]
do 
echo $i
((i++))
done

La variable comienza con un valor 0 y el operador de incremento la aumentará en uno. La condición establecida es menor o igual a cinco, por lo que el comando seguirá iterando hasta que la salida llegue a cinco. La salida de ese script será la siguiente:

0
1
2
3
4
5

El último tipo de bucle, until, es el opuesto a while. Repetirá el comando hasta que la condición se convierta en verdadera.

Si queremos la misma salida que en el ejemplo while anterior utilizando el bucle until, podemos escribir el script de la siguiente manera:

#!/bin/bash
i=0
until [ $i -gt 5 ]
do 
echo $i
((i++))
done

Ahora, este comando se reproducirá hasta que el valor de salida llegue a cinco. La salida será la misma que en nuestro ejemplo con el bucle while:

0
1
2
3
4
5

6. Declaraciones condicionales

Muchos lenguajes de programación, incluido bash, utilizan sentencias condicionales como if, then y else para la toma de decisiones. Ejecutan comandos e imprimen salidas dependiendo de las condiciones.

La sentencia if va seguida de una expresión condicional. Después, le sigue then y el comando para definir la salida de la condición. El script ejecutará el comando si la condición expresada en la sentencia if es verdadera.

Sin embargo, si deseas ejecutar un comando diferente si la condición es falsa, añade una sentencia else al script y síguela con el comando.

Echemos un vistazo a las sentencias if, then y else. Antes de la sentencia, incluiremos una variable para que el usuario pueda introducir un valor:

#!/bin/bash
echo “Ingresa un número”
read num
if [[$num -gt 10]]
then
echo “El número es mayor a 10”
else
echo “El número es menor a 10”

7. Lectura y escritura de archivos

Existen varios métodos para leer un archivo, siendo el comando cat el más popular. Ten en cuenta que este comando lee todo el contenido del archivo.

Para leer el contenido línea por línea, utiliza el comando read y un bucle. Antes de escribir un script para leer un fichero, asegúrate primero de que el fichero existe.

En el siguiente ejemplo, tenemos un archivo to-do.txt que contiene una lista de tareas pendientes:

Responder email
Finalizar informe
Llamar clientes
Evaluar equipo

Utilizaremos los comandos cat y read en nuestra función bash para leer e imprimir el contenido del archivo to-do.txt. La primera parte del script utilizará el comando cat, mientras que la segunda parte utilizará el comando read en un bucle.

#!/bin/bash
echo “Leyendo el archivo utilizando el comando cat”
content=’cat to-do.txt’
echo $content
echo “Leyendo el archivo utilizando el comando leer y bucle”
filename=’to-do.txt’
while read line
do
echo $line
done<$filename

La salida del script será la siguiente:

Leyendo el archivo utilizando el comando cat
Responder email Finalizar informe Llamar clientes Evaluar equipo
Leyendo el archivo utilizando el comando leer y bucle
Responder email
Finalizar informe
Llamar clientes
Evaluar equipo

Para escribir la salida de un comando en un archivo, utiliza los operadores de redirección, representados con los símbolos > y >>, y acompáñalos del nombre del archivo: 

output > nombre del archivo
output >> nombre del archivo

Ten cuidado al elegir el operador. Si el archivo existe, el operador > sobrescribirá su contenido con una cadena de longitud cero. Esto significa que perderás el contenido del archivo existente. Si el nombre de archivo introducido no existe, lo creará.

El operador >>, por otro lado, añadirá la salida al archivo dado. 

Aquí una simple redirección para escribir la salida en un archivo de texto:

echo "¡Hola, mundo!" >> hola_mundo.txt

La redirección también funciona con el comando read para escribir cualquier entrada del usuario. Este ejemplo de script añadirá el valor introducido en el archivo name.txt:

#!/bin/bash
echo “Ingresa tu nombre”
read Name
echo $Name >> nombre.txt

Como el script redirige la salida de la variable al archivo, no verás ninguna salida impresa. Para ver la salida imprimiendo el contenido del archivo, añade la siguiente línea de comando para leer el archivo:

echo 'cat nombre.txt'

Asegúrate de que tienes permiso para leer y escribir en el archivo para evitar el error de permiso denegado. Si deseas añadir la salida a archivos existentes, asegúrate de escribir los nombres de archivo correctos.

4 funciones sencillas para probar en tu primer bash script

Ahora que conocemos algunos comandos bash, veremos ejemplos de funciones bash más básicas para tu primer script.

Como mencionamos anteriormente, cuando quieras escribir un archivo de script bash, utiliza el comando nano filename.sh para crear y abrir un archivo .sh, y comenzar a escribir tus funciones bash. No olvides salir y guardar el archivo cuando hayas terminado.

Comienza con una función echo sencilla

Empecemos con una simple función echo. Empieza definiendo el nombre de la función seguido del comando echo en la línea siguiente, como en el siguiente ejemplo: 

#!/bin/bash
testfunction () {
echo "Mi primera función"
}
testfunction

Guarda este script en testFunction.sh. Cuando ejecutes el script en la línea de comandos, deberías ver la siguiente salida:

Mi primera función

Ten en cuenta que si intercambias la posición de la definición de la función con la llamada a la función, se producirá un error. Veamos el ejemplo siguiente:

#!/bin/bash
testfunction
testfunction(){
echo “Mi primera función”
}

Este fragmento no funcionará. Llama a la función en la segunda línea de comando y define la función más tarde. En este caso, el intérprete no puede encontrar la función cuando ejecuta el script, resultando en un error de comando no encontrado.

Ejemplo de comando no encontrado utilizando Bash

Utiliza pocos parámetros

Las funciones bash aceptan cualquier número de parámetros. El siguiente ejemplo acepta dos parámetros:

#!/bin/bash
testfunction () {
echo $1
echo $2
}
testfunction “Hello” “World”

$1 representa el primer argumento, mientras que $2 representa el segundo argumento en la línea de ejecución de la función. Como hemos utilizado “Hello” y “World” para los argumentos, la salida tendrá este aspecto:

Prueba del comando Bash

También puedes utilizar los argumentos de la línea de comandos y realizar funciones bash. Uno de estos ejemplos se muestra a continuación:

#!/bin/bash
addition () {
sum=$(($1+$2))
return $sum
}
read -p "Ingresa un número: " int1
read -p "Ingresa un número: " int2
addition $int1 $int2
echo "El resultado es : " $?

La suma se asigna en una variable sum y ésta se devuelve desde la función. Las funciones Bash siempre devuelven un único valor. La entrada del usuario se toma usando read para ambos números. Finalmente, el resultado se imprime usando $? que almacena el valor de retorno $suma de la función.

Crea directorios y cambia rutas

Ahora, veamos otro ejemplo de función donde primero creamos un directorio y luego cambiamos la ruta para que apunte a una nueva ubicación. Esta función contendrá comandos Linux mkdir y cd para crear un nuevo directorio y cambiar el directorio actual:

#!/bin/bash
sampleFunction () {
mkdir -p $1
cd $1
}
sampleFunction myDir

La función leerá el primer argumento y creará un directorio con ese nombre. Después de ejecutar el script, comprueba la ruta de trabajo actual utilizando el comando pwd en el terminal. Verás que actualmente estás dentro del recién creado myDir.

Combinar bucles y condicionales

Los bucles y las sentencias condicionales también son populares en los scripts bash. Vamos a ver algunos casos de uso de ambos en el mismo script:

#!/bin/bash
isvalid=true
count=1
while [ $isvalid ]
do
echo $count
if [ $count -eq 5 ];
then
break
fi
((count++))
done

El ejemplo anterior utiliza las sentencias while e if. Esto ejecuta el bucle while cinco veces después de comprobar la sentencia condicional.

La salida de este script será:

1
2
3
4
5

El bucle for puede incrementar y disminuir los contadores. A continuación se muestra un ejemplo del bucle for:

#!/bin/bash
for (( count=10; count>0; count-- ))
do
echo -n "$count "
done

La salida de este bucle debería ser:

10 9 8 7 6 5 4 3 2 1

Con las sentencias if, también podemos definir else if utilizando la sentencia elif:

#!/bin/bash
echo "Ingresa un número válido"
read n
if [ $n -eq 101 ];
then
echo "Éste es el primer número"
elif [ $n -eq 510 ];
then
echo "Éste es el segundo número"
elif [ $n -eq 999 ];
then
echo "Éste es el tercer número"
else
echo "No hay números"
fi

También podemos escribir ese script utilizando la sentencia case. En las sentencias case, ;; representa un salto de caso, por lo que si el valor de la variable cumple alguna de las condiciones, salta al final del script:

#!/bin/bash
echo "Ingresa un número válido"
read n
case $n in
101)
echo "Éste es el primer número" ;;
510)
echo "Éste es el segundo número" ;;
999)
echo "Éste es el tercer número" ;;
*)
echo "No hay números" ;;
esac

Cómo ejecutar un script Bash

Ahora que hemos escrito un bash script, aprendamos a ejecutarlo desde la terminal. Hay tres métodos para hacerlo: usando el comando bash, usando el comando ./ y ejecutando el script desde un directorio diferente.

Uso del comando bash

El primer método es utilizando el comando bash desde el directorio apropiado. Por ejemplo, puedes tener un script bash function.sh que contenga funciones echo simples en el directorio Test/Bash. Primero tienes que abrir el directorio utilizando este comando:

cd Test/Bash

A continuación, ejecuta el siguiente comando bash para ejecutar el script bash:

bash function.sh

Deberías ver la salida así:

Salida del comando Bash

Si intentas ejecutar el script sin el comando bash, recibirás un mensaje de error de comando no encontrado.

Linea del comando mostrando error en la salida del comando bas no encontrado

Uso del comando ./

Puedes ejecutar un script bash sin el comando bash. Sin embargo, tienes que configurar el archivo para que tengas el permiso de ejecución utilizando el siguiente comando desde el directorio apropiado:

chmod +x function.sh

Este comando modifica los permisos del archivo para que todo el mundo pueda ejecutarlo. Una vez hecho esto, ejecuta el script bash usando este comando:

./funcion.sh

Si no estableces el permiso correctamente, el terminal imprimirá un mensaje de error Permiso denegado:

Linea de comando mostrando error por permiso denegado

Al igual que el comando bash, también obtendrás un error de comando no encontrado si no utilizas ./ en tu comando.

Ejecutar el script desde un directorio diferente

Otra alternativa es ejecutar el script desde un directorio diferente. Después de crear el script bash, utiliza el comando pwd para encontrar tu directorio actual. Una vez que conozcas la ruta, puedes ejecutar el script desde cualquier directorio. Por ejemplo, utiliza el siguiente comando para ejecutar function.sh desde el directorio de inicio:

bash Test/Bash/function.sh

Consejo profesional

Utiliza el comando cd para ir directamente al directorio raíz, independientemente del directorio en el que te encuentres.

Conclusión

Bash lee comandos de shell e interactúa con el sistema operativo para ejecutarlos. El gran aspecto de bash es que puedes compilar muchos comandos y funciones bash en un único script ejecutable, lo que te ayuda a agilizar tu flujo de trabajo.

Para crear un archivo de bash script, necesitas entender los diversos comandos del shell y su sintaxis correcta. En este tutorial, hemos cubierto siete comandos básicos:

  • Comentarios
  • Variables
  • Echo
  • Funciones
  • Bucles
  • Declaraciones condicionales
  • Lectura y escritura de archivos

Sin embargo, hay mucho más que aprender si quieres ser capaz de utilizar todo el potencial de bash. Practica con los ejemplos que te hemos proporcionado y continúa explorando bash para que puedas escribir scripts mejores y más eficientes.

Hemos cubierto las tres formas de ejecutar un script bash. Si tienes alguna pregunta o comentario, déjalo en la sección de abajo. 

Bash script – Preguntas frecuentes 

¿Es fácil aprender Bash?

Bash es bastante fácil de aprender y muchos estudiantes dominan, tanto los comandos básicos, como los avanzados en aproximadamente medio año. 

¿Es Bash más fácil que Python?

No, Python sigue siendo más fácil y sencillo que Bash. Dado que Bash fue originalmente un reemplazo de software para Bourne shell, Bash sigue siendo difícil de escribir en comparación con Python. Python también es más potente que Bash.

¿Para qué sirve Bash?

Bash scripting se utiliza sobre todo para automatizar tareas de desarrollo como la compilación de código, la depuración, la gestión de cambios y las pruebas. Los ingenieros de redes también utilizan Bash para probar, optimizar y configurar redes organizativas.

Author
El autor

Gustavo B.

Gustavo es un apasionado por la creación de sitios web. Se enfoca en la aplicación de estrategias SEO en Hostinger para España y Latinoamérica, así como la creación de contenidos de alto nivel. Cuando no está aplicando nuevos trucos en WordPress lo puedes encontrar tocando la guitarra, viajando o tomando un curso online.