Introducción a las secuencias de comandos de Bash Shell

Una descripción detallada de la creación de scripts de Bash Shell

Las secuencias de comandos de shell son una forma poderosa de automatizar las tareas que ejecuta regularmente en su computadora.

En este tutorial, ofrezco una amplia descripción general de los scripts de shell y seré la referencia básica para tutoriales más detallados y avanzados sobre la creación de scripts de shell prácticos.

Echa un vistazo a miintroducción a Bashcorreo.

Bash le brinda un conjunto de comandos que, juntos, pueden usarse para crear pequeños programas, que por convención llamamos scripts.

Note la diferencia. No decimos programación Bash sino scripting Bash, y no llamamos a los scripts Bash “programas Bash”. Esto se debe a que, por lo general, puede alcanzar una cierta complejidad antes de sentir que sus guiones se salen de control.

Pero los scripts de Bash son geniales porque no necesita nada más que Bash para ejecutarlos. Sin compilador, sin intérprete, solo su shell.

Hay muchas cosas que extrañará de los lenguajes de programación como Perl, JavaScript o Python.

Las variables no tienen alcance, todas son globales, no hay una biblioteca estándar, no tienes un sistema de módulos, por ejemplo. Pero las ventajas son bastante grandes: puede invocar muy fácilmente cualquier herramienta CLI como si estuviera en el shell, y el enfoque de Unix de tener muchos pequeños comandos de utilidad realmente hace brillar los scripts de shell. Realice solicitudes de red conwget, procesar texto usandoawk, y más.

La creación de scripts de Shell es una de las herramientas que es mejor que conozca, al menos sepa cómo leer un programa cuando lo vea y las ventajas que puede aportar a su trabajo diario.

Este tutorial lo guía a la teoría y los conceptos de scripting Bash. Publicaré tutoriales más detallados sobre técnicas específicas o cómo resolver problemas específicos en el futuro.

Lo esencial

Los scripts se almacenan en archivos. Puede dar cualquier nombre y extensión a un script de shell, no importa. Lo importante es que debe comenzar con un "shebang" en la primera línea:

#!/bin/bash

y debe ser un archivo ejecutable.

Un archivo se establece como ejecutable usandochmod, un comando de utilidad.

Puedes usarlo así:

chmod u+x myscript

para hacer elmyscriptarchivo ejecutable para su usuario (no voy a entrar en el agujero del conejo de permisos aquí, pero los cubriré pronto).

Ahora puede ejecutar el script si está en la misma carpeta llamándolo./myscripto utilizando la ruta completa.

Mientras aprende, le animo, cuando sea posible, a utilizar un parque infantil en línea.como éste, facilita las pruebas.

Comentarios

Los comentarios son una de las cosas más importantes al escribir programas. Una línea que comienza con el#El símbolo es un comentario (con la excepción de la línea shebang que vio arriba aquí).

#!/bin/bash
# this is a comment

Un comentario también puede comenzar al final de una línea:

#!/bin/bash
echo ok # this is a comment

Variables

Puede establecer variables mediante el=operador:

name=value

Ejemplos:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

Puede imprimir una variable utilizando elechocomando incorporado y anteponiendo un$al nombre de var:

echo $ROOM_NUMBER
echo $name

Operadores

Bash implementa algunos operadores aritméticos que se usan comúnmente en los lenguajes de programación:

  • +agregar
  • -sustraer
  • *multiplicar
  • /dividir
  • %módulo (resto de la división)
  • **exponenciación

Puede comparar valores usando

  • <
  • <=
  • ==
  • >=
  • >

También puede utilizar estos operadores de comparación:

  • -ltMás bajo que
  • -gtmas grande que
  • -lemenor o igual que
  • -gemayor o igual que
  • -eqigual a
  • -neno igual a

De este modo:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

Operadores logicos:

  • &&Y lógico
  • ||OR lógico

Estos atajos permiten realizar una operación aritmética y luego una asignación:

  • +=
  • -=
  • *=
  • /=
  • %=

Hay algunos operadores más, pero esos son los más comunes.

Puede imprimir cualquier cosa en la pantalla utilizando elechomando:

#!/bin/bash
echo "test"
echo test
echo testing something

Condiciones lógicas

Y: evalúa a0(cero) si amboscommandyanothercommandejecutar y regresar0. Devolver cero en los comandos de shell significa que el comando fue exitoso. Un mensaje de error se identifica mediante un valor de retorno distinto de cero.

command && anothercommand

O: evalúa a0(cero) si al menos uno decommandyanothercommandejecutar y regresar0.

command || anothercommand

NO: invertir el valor de retorno lógico decommand:

! command

Estructuras de Control

En puede utilizar varias estructuras de control con las que quizás esté familiarizado:

Declaraciones if / else

Sencilloif:

if condition
then
  command
fi

ifentonceselse:

if condition
then
  command
else
  anothercommand
fi

Anidadoif- entonces -else:

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

Puedes quedarte con elelseen la misma línea usando un punto y coma:

if condition ; then
  command
fi

Ejemplo:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

¿Observa los corchetes? Debemos agregar corchetes cuando tengamos que hacer algún tipo de evaluación de una expresión booleana.

Bucles

Mientras bucle

Mientrasconditionse resuelve en un valor verdadero, ejecutecommand

while condition
do
  command
done

Hasta

Hastaconditionse resuelve en un valor verdadero, ejecutecommand

until condition
do
  command
done

Porque en

Iterar una lista y ejecutar un comando para cada elemento.

for item in list
do
  command
done

Romper y continuar

Dentro de los bucles, puede utilizar elbreakycontinuedeclaraciones para romper el ciclo por completo, o simplemente omitir la iteración actual.

Caso

Una estructura de control de casos le permite elegir diferentes rutas según un valor.

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

Como confi,esactermina la estructura del caso y, como puede notar, escasedeletreado al revés.

Agregamos un punto y coma doble después de cada caso.

A*)case manejaría todos los casos no expresados explícitamente. Usando un|símbolo puede expresar múltiples opciones para un solo caso.

Ejemplo:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

Seleccione

AselectLa estructura muestra al usuario un menú de opciones para elegir:

select item in list
do
  command
done

Ejemplo:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

Condiciones de prueba

Usé el términoconditionen las estructuras de control anteriores.

Puedes usar eltestBash comando incorporado para verificar una condición y devolver un verdadero (0) o valor falso (no0).

Aquí hay un ejemplo:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

Leer la entrada desde la línea de comando

Puede hacer que sus scripts sean interactivos usando elreadcomando incorporado. Este comando lee una línea de la entrada estándar y puede formatear la entrada de una manera muy flexible.

El uso más simple es:

echo "Age:"
read age

esto imprimirá "Edad:" y puede ingresar un número, presione enter y ese número será asignado alagevariable.

los-popción dereadproporciona un indicador integrado y coloca la entrada en elagevariable:

read -p "Age: " age

losreadEl comando tiene muchas más opciones, que puede inspeccionar escribiendohelp readen Bash.

Añadiendo opciones

Las opciones se especifican mediante un guión seguido de una letra, como esta:

ls -a
driveCar -b "Ford"

En su código, usa el comando incorporadogetoptspara analizar las opciones y obtener el valor.

Si aceptamos opcionesayb, alimentamosgetopts aba un bucle while.

Si la opciónbacepta un valor, agregamos dos puntos:después, formateamos nuestrogetoptsllamar así:getopts ab: arg

Aquí hay un fragmento:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

En este guión,$OPTARGse le asigna automáticamente la letra de opción. Nosotros decimosgetoptsqué opciones aceptamos y manejamos cada caso por separado.

Los errores son manejados automáticamente porgetopts. Podemos elegir manejar los mensajes de error nosotros mismos, anteponiendo dos puntos.:antes de la definición de argumentos:getopts :xy: arg.

Entonces también manejamos el\?y:casos. La primera se llama cuando pasamos una opción no válida y la segunda se llama cuando se nos escapa una opción:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

Ahora, si se olvida de agregar un argumento, los mensajes de error son diferentes.

Trabajando con parámetros

Dentro de un script puede acceder a cualquier parámetro que se haya pasado en el momento de la invocación. Usted accede a ellos usando$0,$1,$2y así sucesivamente, dependiendo de la posición, donde$0es el nombre del comando y al incrementar el número se incrementa la posición del parámetro. Después de la posición 9 necesitas llaves:${10},${11}...

Por ejemplo ejecutando estostartCartexto:

#!/bin/bash
echo $0
echo $1

como./startCar fiestaimprimirá

./startCar
fiesta

El especial$*la sintaxis imprime todos los parámetros y$#el número de parámetros pasados:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

Separar opciones de parámetros

Si tiene tanto opciones como parámetros, debe separarlos. Haces esto con un guion:

driveCar -m "Ford Fiesta" - Milan Florence Rome

Trabajando con cadenas

Dada una cadena:

dogname="Roger"

Puedes obtener su longitud usando${#dogname}

Siempre use comillas alrededor de las cadenas, cuando trabaje con ellas, para evitar que Bash interprete los caracteres especiales dentro de ellas.

Puede comparar 2 cadenas usando el=o==operador, es lo mismo:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

No es una tarea debido a los espacios que rodean el=.

También puede verificar la desigualdad:

"$dogname" != "$anotherdogname"

Matrices

Una matriz es una lista de elementos, declarados entre paréntesis:

breeds=(husky setter "border collie" chiwawa)

Puede hacer referencia a cualquier elemento dentro de una matriz utilizando corchetes:

breeds[0]
breeds[1]

y puede obtener el número total de elementos utilizando esta sintaxis especial:

${#breeds[@]}

Comandos incorporados

Hasta ahora, ya ha visto algunos comandos integrados, como estos:

  • test
  • read
  • echo

Bash tiene varios de ellos. Puedes verlos a todos llamandohelpy luego puede encontrar la ayuda para cada comando usando por ejemplohelp read.

Funciones

Al igual que en JavaScript o en cualquier otro lenguaje de programación, puede crear pequeños fragmentos de código reutilizables, darles un nombre y llamarlos cuando lo necesite.

Bash los llamafunciones.

Define una función con

function name {

}

Ejemplo:

function cleanFolder {

}

y lo invocas así:

cleanFolder

Puede pasar parámetros a carpetas, sin la necesidad de declararlas, simplemente haga referencia a ellas como$1,$2etc. Como lo hace con los parámetros de la secuencia de comandos:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

Descarga mi gratisManual de comandos de Linux


Más tutoriales de cli: