Hoy hablaremos sobre scripts bash. Este - , escrito para el shell bash. Hay otros shells como zsh, tcsh, ksh, pero nos centraremos en bash. Este material está destinado a todos, la única condición es la capacidad de trabajar en Linux.
Los scripts de línea de comandos son colecciones de los mismos comandos que se pueden ingresar desde el teclado, recopilarse en archivos y combinarse con un propósito común. En este caso, los resultados del trabajo de los equipos pueden tener un valor independiente o servir como datos de entrada para otros equipos. Los scripts son una forma poderosa de automatizar acciones realizadas con frecuencia.
Entonces, si hablamos de la línea de comando, te permite ejecutar varios comandos a la vez ingresándolos separados por punto y coma:
pwd ; whoami De hecho, si probó esto en su terminal, su primer script bash que involucra dos comandos ya estará escrito. Funciona así. equipo primero pwd muestra información sobre el directorio de trabajo actual, luego el comando whoamimuestra información sobre el usuario con el que inició sesión.
Con este enfoque, puede combinar tantos comandos como desee en una línea, el único límite es la cantidad máxima de argumentos que se pueden pasar al programa. Puede definir este límite usando el siguiente comando:
getconf ARG_MAXLa línea de comandos es una gran herramienta, pero debes ingresar comandos cada vez que los necesites. ¿Qué pasaría si escribiéramos un conjunto de comandos en un archivo y simplemente llamáramos a ese archivo para ejecutarlos? De hecho, el archivo del que estamos hablando se llama script de línea de comando.
Cómo funcionan los scripts de bash
Crea un archivo vacío usando el comando touch. Su primera línea debe indicar qué shell vamos a utilizar. Estamos interesados en bash, por lo que la primera línea del archivo será:
#!/bin/bash Otras líneas de este archivo utilizan el símbolo de almohadilla para indicar comentarios que el shell no procesa. Sin embargo, la primera línea es un caso especial, hay un hash seguido de un signo de exclamación (esta secuencia se llama ) y el camino hacia bash, indica al sistema que el script fue creado específicamente para bash.
Los comandos de Shell están separados por un avance de línea, los comentarios están separados por un signo de almohadilla. Esto es lo que parece:
#!/bin/bash
# This is a comment
pwd
whoamiAquí, al igual que en la línea de comando, puede escribir comandos en una línea, separados por punto y coma. Sin embargo, si escribe los comandos en líneas diferentes, el archivo será más fácil de leer. En cualquier caso, el shell los procesará.
Configuración de permisos de archivos de script
Guarda el archivo dándole un nombre. myscript, y el trabajo de creación del script bash está casi terminado. Ahora todo lo que queda es hacer que este archivo sea ejecutable; de lo contrario, si intentas ejecutarlo, encontrarás un error. Permission denied.

Intentar ejecutar un archivo de secuencia de comandos con permisos configurados incorrectamente
Hagamos el archivo ejecutable:
chmod +x ./myscriptAhora intentemos ejecutarlo:
./myscriptDespués de configurar los permisos, todo funciona como debería.

Ejecutando exitosamente el script bash
Salida de mensaje
Para mostrar texto en la consola Linux El comando se aplica echo. Usemos el conocimiento de este hecho y editemos nuestro script, agregando explicaciones a los datos que generan los comandos que ya están en él:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiEsto es lo que sucede después de ejecutar el script actualizado.

Enviar mensajes desde un script
Ahora podemos mostrar notas explicativas usando el comando echoSi no sabes cómo editar un archivo usando herramientas Linuxo no han conocido al equipo anteriormente echo, echa un vistazo a material.
Usando variables
Las variables le permiten almacenar información en un archivo de script, como los resultados de los comandos, para que otros comandos los utilicen.
No hay nada de malo en ejecutar comandos individuales sin almacenar sus resultados, pero este enfoque tiene capacidades bastante limitadas.
Hay dos tipos de variables que se pueden utilizar en scripts bash:
- Variables de entorno
- Variables de usuario
Variables de entorno
A veces, los comandos de shell necesitan funcionar con algunos datos del sistema. A continuación se muestra un ejemplo de cómo mostrar el directorio de inicio del usuario actual:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Tenga en cuenta que podemos utilizar una variable del sistema. $HOME entre comillas dobles, esto no impedirá que el sistema lo reconozca. Esto es lo que obtienes si ejecutas el escenario anterior.

Usar una variable de entorno en un script
¿Qué sucede si necesita mostrar un signo de dólar en la pantalla? Intentemos esto:
echo "I have $1 in my pocket" El sistema detectará un signo de dólar en una cadena entre comillas y asumirá que hemos hecho referencia a una variable. El script intentará mostrar el valor de una variable indefinida. $1. Esto no es lo que necesitamos. ¿Qué hacer?
En esta situación, será útil utilizar el carácter de escape, una barra invertida, antes del signo de dólar:
echo "I have $1 in my pocket"El script ahora generará exactamente lo que se espera.

Usando una secuencia de escape para imprimir un signo de dólar
Variables de usuario
Además de las variables de entorno, los scripts bash le permiten definir y utilizar sus propias variables en el script. Estas variables mantienen un valor hasta que el script completa su ejecución.
Al igual que con las variables del sistema, se puede acceder a las variables del usuario mediante el signo de dólar:
TNW-CUS-FMP: código de promoción para un 10% de descuento en nuestros servicios, disponible para activación dentro de 7 días
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Esto es lo que sucede después de ejecutar dicho script.

Variables personalizadas en un script
Sustitución de comando
Una de las características más útiles de los scripts bash es la capacidad de extraer información de la salida del comando y asignarla a variables, lo que le permite utilizar esta información en cualquier parte del archivo de script.
Esto se puede hacer de dos maneras.
- Usando la comilla invertida "`"
- Por diseño
$()
Al utilizar el primer método, tenga cuidado de no incluir comillas simples en lugar de la comilla grave. El comando debe estar encerrado entre dos de estos iconos:
mydir=`pwd`En el segundo enfoque, lo mismo se escribe así:
mydir=$(pwd)Y el guión podría terminar luciendo así:
#!/bin/bash
mydir=$(pwd)
echo $mydir Durante su operación, la salida del comando pwdse guardará en una variable mydir, cuyo contenido, utilizando el comando echo, irá a la consola.

Un script que guarda los resultados de un comando en una variable.
Operaciones matemáticas
Para realizar operaciones matemáticas en un archivo de script, puede utilizar una construcción como $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operaciones matemáticas en un guión
constructo de control si-entonces
En algunos escenarios, es necesario controlar el flujo de ejecución del comando. Por ejemplo, si un determinado valor es mayor que cinco, es necesario realizar una acción; en caso contrario, otra. Esto es aplicable en muchas situaciones, y aquí la estructura de control nos ayudará if-then. En su forma más simple se ve así:
if команда
then
команды
fiAquí hay un ejemplo práctico:
#!/bin/bash
if pwd
then
echo "It works"
fi En este caso, si se ejecuta el comando pwdse completará con éxito, el texto "funciona" se mostrará en la consola.
Usemos el conocimiento que tenemos y escribamos un guión más complejo. Digamos que necesitamos encontrar un determinado usuario en /etc/passwd, y si lograste encontrarlo informa que existe.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiEsto es lo que sucede después de ejecutar este script.

Búsqueda de usuarios
Aquí usamos el comando grepbuscar un usuario en un archivo /etc/passwd. si el equipo grepdesconocido para usted, su descripción se puede encontrar .
En este ejemplo, si se encuentra al usuario, el script mostrará el mensaje correspondiente. ¿Qué pasa si no se puede encontrar al usuario? En este caso el script simplemente completará la ejecución sin decirnos nada. Nos gustaría que él también nos contara sobre esto, así mejoraremos el código.
constructo de control si-entonces-si no
Para que el programa pueda informar tanto los resultados de una búsqueda exitosa como los fallidos, usaremos la construcción if-then-else. Así es como funciona:
if команда
then
команды
else
команды
fi Si el primer comando devuelve cero, lo que significa que se ejecutó exitosamente, la condición será verdadera y la ejecución no continuará en la rama. else. De lo contrario, si se devuelve algo distinto de cero, lo que indicaría un error o un resultado falso, los comandos posteriores else.
Escribamos el siguiente script:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Su ejecución se fue por el desagüe else.

Ejecutar un script con una construcción if-then-else
Bueno, sigamos adelante y preguntémonos por condiciones más complejas. ¿Qué pasa si necesita verificar no una condición, sino varias? Por ejemplo, si se encuentra el usuario deseado, se debe mostrar un mensaje, si se cumple alguna otra condición, se debe mostrar otro mensaje, y así sucesivamente. En tal situación, las condiciones anidadas nos ayudarán. Se parece a esto:
if команда1
then
команды
elif команда2
then
команды
fi Si el primer comando devuelve cero, lo que indica que se ejecutó exitosamente, se ejecutarán los comandos del primer bloque. thenDe lo contrario, si la primera condición es falsa y el segundo comando devuelve cero, se ejecutará el segundo bloque de código.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi En dicho script, puede, por ejemplo, crear un nuevo usuario usando el comando useradd, si la búsqueda no produjo resultados, o hacer algo más útil.
Comparación de números
En los scripts puedes comparar valores numéricos. A continuación se muestra una lista de comandos relevantes.
n1 -eq n2Devuelve verdadero sin1igualn2.
n1 -ge n2Devuelve verdadero sin1más o igualn2.
n1 -gt n2Devuelve verdadero sin1másn2.
n1 -le n2Devuelve verdadero sin1menos o igualn2.
n1 -lt n2Devuelve verdadero si n1 es menor quen2.
n1 -ne n2Devuelve verdadero sin1no igualn2.
Como ejemplo, probemos con uno de los operadores de comparación. Tenga en cuenta que la expresión está entre corchetes.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiEsto es lo que generará este comando.

Comparación de números en guiones.
Valor variable val1mayor que 5, la rama termina ejecutándose thenoperador de comparación y se muestra el mensaje correspondiente en la consola.
Comparación de cadenas
Los scripts también pueden comparar valores de cadena. Los operadores de comparación parecen bastante simples, pero las operaciones de comparación de cadenas tienen ciertas características, que veremos a continuación. Aquí hay una lista de operadores.
str1 = str2Prueba la igualdad de las cadenas y devuelve verdadero si las cadenas son idénticas.
str1 != str2Devuelve verdadero si las cadenas no son idénticas.
str1 < str2Devuelve verdadero sistr1menos questr2.
str1 > str2Devuelve verdadero sistr1mas questr2.
-n str1Devuelve verdadero si la longitudstr1Por encima de cero.
-z str1Devuelve verdadero si la longitudstr1es cero.
A continuación se muestra un ejemplo de comparación de cadenas en un script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiComo resultado de ejecutar el script, obtenemos lo siguiente.

Comparar cadenas en scripts
Aquí hay una característica de la comparación de cadenas que vale la pena mencionar. Es decir, los operadores ">" y "<" deben tener como carácter de escape una barra invertida; de lo contrario, el script no funcionará correctamente, aunque no aparecerán mensajes de error. El script interpreta el signo ">" como un comando de redirección de salida.
Así es como se ve trabajar con estos operadores en el código:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAquí están los resultados del guión.

Comparación de cadenas, advertencia dada
Tenga en cuenta que el script, aunque se ejecuta, emite una advertencia:
./myscript: line 5: [: too many arguments Para deshacernos de esta advertencia, concluimos $val2 entre comillas dobles:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiAhora todo funciona como debería.

Comparación de cadenas
Otra característica de los operadores ">" y "<" es cómo trabajan con caracteres en mayúsculas y minúsculas. Para comprender esta característica, preparemos un archivo de texto con el siguiente contenido:
Likegeeks
likegeeks Salvémoslo dándole un nombre. myfile, luego ejecute el siguiente comando en la terminal:
sort myfileOrdenará las líneas del archivo de esta manera:
likegeeks
Likegeeks Equipo sort, de forma predeterminada, ordena las cadenas en orden ascendente, es decir, la letra minúscula en nuestro ejemplo es más pequeña que la mayúscula. Ahora preparemos un script que comparará las mismas cadenas:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSi lo ejecuta, resulta que todo es al revés: la letra minúscula ahora es más grande que la mayúscula.

El comando ordenar y comparar cadenas en un archivo de script
En los comandos de comparación, las letras mayúsculas son más pequeñas que las minúsculas. La comparación de cadenas aquí se realiza comparando los códigos ASCII de los caracteres; por lo tanto, el orden de clasificación depende de los códigos de caracteres.
Equipo sort, a su vez, utiliza el orden de clasificación especificado en la configuración de idioma del sistema.
comprobaciones de archivos
Quizás los siguientes comandos se utilicen con mayor frecuencia en scripts bash. Le permiten comprobar diversas condiciones relativas a los archivos. Aquí hay una lista de estos comandos.
-d fileComprueba si un archivo existe y es un directorio.
-e fileComprueba si el archivo existe.
-f fileComprueba si un archivo existe y es un archivo.
-r fileComprueba si el archivo existe y es legible.
-s file ПComprueba si el archivo existe y no está vacío.
-w fileComprueba si el archivo existe y se puede escribir.
-x fileComprueba si el archivo existe y es ejecutable.
file1 -nt file2Comprueba si es más nuevo.file1quefile2.
file1 -ot file2Comprueba si es mayorfile1quefile2.
-O fileComprueba si el archivo existe y es propiedad del usuario actual.
-G fileComprueba si el archivo existe y si su ID de grupo coincide con el ID de grupo del usuario actual.
Estos comandos, así como muchos otros que se analizan hoy, son fáciles de recordar. Sus nombres, al ser abreviaturas de varias palabras, indican directamente los controles que realizan.
Probemos uno de los comandos en la práctica:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiEste script, para un directorio existente, mostrará su contenido.

Listar el contenido de un directorio
Creemos que usted mismo puede experimentar con los comandos restantes; todos se utilizan según el mismo principio.
resultados
Hoy hablamos sobre cómo empezar a escribir scripts bash y cubrimos algunas cosas básicas. De hecho, el tema de la programación bash es enorme. Este artículo es una traducción de la primera parte de una gran serie de 11 materiales. Si quieres continuar ahora mismo, aquí tienes una lista de los originales de estos materiales. Para mayor comodidad, se incluye aquí la traducción de lo que acaba de leer.
- — Aquí estamos hablando de cómo comenzar a crear scripts bash, se considera el uso de variables, se describen estructuras condicionales, cálculos, comparaciones de números, cadenas y cómo obtener información sobre archivos.
- — aquí se revelan las características de trabajar con bucles for y while.
- — este material está dedicado a los parámetros y claves de la línea de comandos que se pueden pasar a los scripts, trabajando con datos que el usuario ingresa y que se pueden leer desde archivos.
- - aquí estamos hablando de descriptores de archivos y de trabajar con ellos, de entrada, salida, flujos de errores y de redirección de salida.
- - Este material está dedicado a las señales Linux, su procesamiento en scripts y la ejecución de scripts según un cronograma.
- — aquí puede aprender sobre cómo crear y usar funciones en scripts y desarrollar bibliotecas.
- — este artículo está dedicado a trabajar con el editor de texto de transmisión sed.
- — este material está dedicado a la programación en el lenguaje de procesamiento de datos awk.
- — aquí puedes leer sobre el uso de expresiones regulares en scripts bash.
- — aquí se presentan técnicas para trabajar con mensajes que se pueden enviar a los usuarios, así como un método para monitorear el disco.
- — este material está dedicado a la herramienta Expect, con la que puede automatizar la interacción con utilidades interactivas. En particular, estamos hablando de scripts expect y su interacción con scripts bash y otros programas.
Creemos que una de las propiedades valiosas de esta serie de artículos es que comienza con lo más básico, adecuado para usuarios de cualquier nivel, y gradualmente conduce a temas bastante serios, dando a todos la oportunidad de avanzar en el campo de la creación de scripts de línea de comandos. Linux.
¡Queridos lectores! Les pedimos a los gurús de la programación bash que hablen sobre cómo alcanzaron la cima de su dominio, compartan sus secretos y esperamos recibir impresiones de aquellos que acaban de escribir su primer guión.
Solo los usuarios registrados pueden participar en la encuesta. por favor
¿Debería traducir el resto de la serie de artículos?
¡Sí!
No, no es necesario
1030 usuarios votaron. 106 usuarios se abstuvieron.
Fuente: habr.com
