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.
Tabla de Contenidos
¿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.
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:
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í:
Si intentas ejecutar el script sin el comando bash, recibirás un mensaje de error de comando 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:
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.
Comentarios
January 26 2020
Hola, he visto alguno de tus artículos pero no consigo la solución a un problema que tengo: Estoy lanzando un script Linux desde una página Web. Obtengo su PID y hasta aquí todo correcto, pero me gustaría obtener su PID en cualquier momento para saber si ya se está ejecutando. Podría usar un fichero de bloqueo, pero si el proceso acaba bruscamente ya no podría volver a lanzarlo. No he encontrado la manera de obtener dicho script desde ps ni desde pstree y así ver que se está ejecutando, pues siempre me sale (con su PID) "bash", pero como puede ser de otros scripts ya no es fiable. También he mirado por un montón de sitios como hacerlo y las soluciones que ponen no funcionan (o al menos no me sirven). En resumen, me gustaría lanzar un script (por ejemplo: aaa.sh) y con algún comando tipo "ps" obtener en la lista de procesos "aaa.sh" y su PID en cualquier momento. Muchas gracias de antemano: Juanjo
January 24 2022
Verificar que un servicio/proceso se está ejecutando: --------------------------------------------------------- Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo): #!/bin/sh SERVICE='httpd' if ps ax | grep -v grep | grep $SERVICE > /dev/null then echo "El servicio $SERVICE esta ejecutandose" else echo "Chanfle! El servicio $SERVICE esta detenido" fi Espero que ese ejemplo sacado de otra página te pueda ayudar.