Tutoriales sobre Bash Scripting I : Introducción

Hoy os traigo la primera parte de lo que espero sea una nueva serie de posts sobre Bash Scripting.

Para aquellos que me conozcáis de CTF’s o si habéis leido mis writeups os habréis dado cuenta que este lo utilizo muchísimo y tengo fijación por los scripts en una sola linea, esto es una preferencia mía, así que no quiero que os llevéis la idea errónea de que es mejor hacer un script en una linea que hacerlo en un archivo como dios manda jeje Esta manía surge de la necesidad de ejecutar un gran número de comandos en muchos servidores en mi trabajo y, aunque existen otras maneras de hacerlo, me acostumbre a escribirlos todos en una linea y pasarselos a ssh para su ejecución.

Pero vamos a empezar por saber que es Bash. Bash es una shell Unix y lenguaje de comandos que se publicó haya por 1989 y es quizás uno de los más usandos, estando presente en muchas distribuciones Linux, macOS e incluso habiendo una versión para Windows.

El hecho de que sea tan usado me ha ayudado en muchos casos donde me encontraba con diferentes distribuciones donde una de las pocas cosas en común era precisamente esta, lo cual me ha hecho sentirme muy cómodo a la hora de realizar diferentes tareas.

Otra de las cosas por las que me suelo decantar por realizar los scripts en bash es la posibilidad de utilizar el amplio abanico de utilidades de las que disponga el sistema como, por ejemplo, llamar a un script de python para que me realice una acción que de otra forma no podría, o sería demasiado compleja, de realizar solo con bash.

Pero menos chachara y vamos al lio, como realmente Bash es un lenguaje de comandos lo que vamos a hacer es utilizar los propios comandos de Linux para realizar nuestros scripts ¿Que significa esto? Que en lugar de explicaros que hace un cat o un echo, vamos a irnos directamente a ver ejemplos prácticos.

Vamos a comenzar con algunas cosas básicas: estructura, argumentos y variables.

La estructura de Bash no tiene demasiada ciencia, básicamente para Bash cada linea es un comando a ejecutar; en caso de que lo ejecutes desde la linea de comandos Bash interpreta los “;” como saltos de linea, de tal manera que:

#!/bin/bash

echo "primera linea"; echo "segunda linea"

# es igual a:

echo "primera linea"
echo "segunda linea"

Sencillo ¿verdad? Vamos a seguir utilizando el mismo script para ver como podemos utilizar las variables:

#!/bin/bash

1="primera linea"
segunda="segunda linea"

echo $1; echo $segunda

echo $1
echo $segunda

Vemos que para definir una variable simplemente debemos escribir su nombre, para luego obtener su contenido la llamaremos con la sintaxis “$nombre_de_la_variable”

Si ejecutamos este script veremos que solo nos muestra el mensaje “segunda linea” precedido de una linea en blanco, esto es debido a que las variables cuyo nombre son inválidos aunque Bash no muestre ningún error. La variable “$1” para bash realmente es una constante que significa “primer argumento pasado al script”, de tal manera que si al mismo script le pasamos como primer argumento “algo” veremos que este mensaje aparece donde debería aparece “primera linea”. Así que si nuestro script requiere X argumentos los llamaros utilizando la sintaxis “$X” donde X es la posición del argumento pasado al script.

Ahora veamos otra versión del mismo script:

#!/bin/bash

primera="primera linea"
segunda="segunda linea"

echo "$primera"; echo '$segunda'

echo "$primera"
echo '$segunda'

Esta vez hemos nombrado de forma correcta las variables pero en este caso las hemos incluido entre comillas, al ejecutar este script veréis que de la variable “$segunda” no obtenemos su contenido sino que vemos ese mismo texto. Esto se debe a que si incluimos una variable dentro de comillas simples Bash lo interpreta literalmente y no como una variable.

Ahora vamos a ver como podemos asignarle el valor obtenido de otro comando a una variable:

#!/bin/bash

primera=$(hostname)
segunda="segunda linea"

echo "$primera"; echo "$segunda"

echo "$primera"
echo "$segunda"

Como podemos ver ahora en lugar de asignarle un valor a la variable “primera” lo que hago es decirle que ejecute el comando hostname y guarde el contenido en la misma. Esto se aplica no solo a variables, sino en cualquier momento que queramos utilizar el resultado de un comando podemos hacerlo utilizando la sintaxis “$()” como, por ejemplo, en un if.

Bash además tiene una serie de variables especiales que os listo a continuación:

  • $1, $2, $3, … argumentos posicionales de los que ya hablamos.
  • "$@" especie de array que contiene los argumentos posicionales, {$1, $2, $3 ...}.
  • "$*" expansión IFS (Internal Field Separator) de los argumentos posicionales, $1 $2 $3 ....
  • $# número de argumentos posicionales.
  • $- opciones para la shell actual.
  • $$ pid de la shell actual (no subshell).
  • $_ parámetro más actual.
  • $IFS es el (input) field separator.
  • $? código de salida del último comando ejecutado en primer plano.
  • $! pid del comando más reciente ejecutado en segundo plano.
  • $0 nombre de la shell o script.

Creo que con esto he cubierto lo básico para que podáis empezar a jugar un poco con Bash y construir vuestros primeros scripts. En caso de que tengáis dudas o creáis que me haya saltado algo dejarme un comentario y os ayudaré en lo que pueda.

Espero os haya gustado, gracias por la visita; saludos!

Esta entrada fue publicada en bash, tutorial. Guarda el enlace permanente.

Deja un comentario