Menú
Está libre
registro
el principal  /  Navegantes/ Controla ubuntu a través de un script en Windows. Creación de su propio script de ejecución automática al iniciar la computadora

Controlando ubuntu a través de un script en windows. Creación de su propio script de ejecución automática al iniciar la computadora

Hoy hablaremos de scripts bash. Estos son scripts de línea de comandos escritos para el shell bash. Hay otras 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 la línea de comandos de Linux.



Los scripts de línea de comandos son colecciones de los mismos comandos que se pueden ingresar desde el teclado, ensamblar en archivos y unir por algún propósito común. Al mismo tiempo, los resultados del trabajo de los equipos pueden ser de valor independiente o servir como datos de entrada para otros equipos. La secuencia de comandos es una forma poderosa de automatizar las acciones que se realizan con frecuencia.

Entonces, si hablamos de la línea de comandos, te permite ejecutar varios comandos a la vez, ingresándolos separados por punto y coma:

Pwd; quién soy
De hecho, si lo ha probado en su terminal, su primer script bash que usa dos comandos ya ha sido escrito. Funciona así. Primero, el comando pwd muestra información sobre el directorio de trabajo actual, luego el comando whoami muestra información sobre el usuario con el que ha iniciado sesión.

Con este enfoque, puede combinar tantos comandos como desee en una línea, la limitación está solo en el número máximo de argumentos que se pueden pasar al programa. Puede determinar esta limitación utilizando el siguiente comando:

Getconf ARG_MAX
La línea de comandos es una gran herramienta, pero debe ingresar comandos cada vez que los necesite. ¿Qué pasa si escribe un montón de comandos en un archivo y simplemente llama a ese archivo para ejecutarlos? De hecho, el archivo del que estamos hablando se llama script de línea de comandos.

Cómo funcionan los scripts de bash

Cree un archivo vacío con el comando táctil. En su primera línea, necesitamos indicar qué shell vamos a usar. Estamos interesados ​​en bash, por lo que la primera línea del archivo será así:

#! / bin / bash
En otras líneas de este archivo, el carácter hash se usa para indicar comentarios que el shell no procesa. Sin embargo, la primera línea es un caso especial, aquí un hash seguido de un signo de exclamación (esta secuencia se llama shebang) y la ruta a bash indican al sistema que el script fue creado específicamente para bash.

Los comandos de shell están delimitados con avances de línea, los comentarios están delimitados con marcas de almohadilla. Así es como se ve:

#! / bin / bash # Este es un comentario pwd whoami
Aquí, además de en la línea de comandos, puede escribir comandos en una línea, separados por punto y coma. Sin embargo, escribir los comandos en líneas independientes facilita la lectura del archivo. En cualquier caso, el shell los procesará.

Configuración de permisos de archivo de secuencia de comandos

Guarde el archivo con el nombre myscript y casi habrá terminado de crear el script bash. Ahora todo lo que queda es hacer que este archivo sea ejecutable; de ​​lo contrario, al intentar ejecutarlo, se encontrará con el error Permiso denegado.


Intentando ejecutar un archivo de secuencia de comandos con permisos configurados incorrectamente

Hagamos que el archivo sea ejecutable:

Chmod + x ./myscript
Ahora intentemos ejecutarlo:

./myscript
Después de configurar los permisos, todo funciona como debería.


Ejecutando correctamente el script bash

Visualización de mensajes

El comando echo se usa para enviar texto a la consola de Linux. Aprovechemos el conocimiento de este hecho y editemos nuestro script, agregando explicaciones a los datos que muestran los comandos que ya están en él:

#! / bin / bash # nuestro comentario está aquí echo "El directorio actual es:" pwd echo "El usuario que inició sesión es:" whoami
Esto es lo que sucede después de ejecutar el script actualizado.


Visualización de mensajes de una secuencia de comandos

Ahora podemos imprimir leyendas explicativas usando el comando echo. Si no sabe cómo editar un archivo con herramientas de Linux, o no ha visto el comando echo antes, eche un vistazo a este recurso.

Usando Variables

Las variables le permiten almacenar información en un archivo de secuencia de comandos, por ejemplo, los resultados de los comandos que utilizarán otros comandos.

No hay nada de malo en ejecutar comandos individuales sin almacenar los resultados de su trabajo, pero las posibilidades de este enfoque son muy limitadas.

Hay dos tipos de variables que se pueden usar en scripts bash:

  • Variables de entorno
  • Variables de usuario

Variables de entorno

A veces, los comandos de shell necesitan trabajar con algunos datos del sistema. Por ejemplo, aquí se muestra cómo mostrar el directorio de inicio del usuario actual:

#! / bin / bash # mostrar el inicio del usuario echo "El inicio del usuario actual es: $ INICIO"
Tenga en cuenta que podemos usar la variable del sistema $ HOME entre comillas dobles, esto no evitará que el sistema la reconozca. Esto es lo que sucede si ejecuta el script anterior.


Usar una variable de entorno en un script

¿Qué sucede si desea mostrar el signo de dólar en la pantalla? Intentemos esto:

Echo "Tengo $ 1 en mi bolsillo"
El sistema detecta el signo de dólar en la cadena entre comillas y cree que hicimos referencia a una variable. El script intentará mostrar el valor de la variable indefinida $ 1. Esto no es lo que queremos. ¿Qué hacer?

Un carácter de escape con barra invertida antes del signo de dólar puede ayudar en esta situación:

Echo "Tengo \ $ 1 en mi bolsillo"
El script ahora generará exactamente lo que se espera.


Usar una secuencia de escape para generar un signo de dólar

Variables de usuario

Además de las variables de entorno, los scripts bash le permiten establecer y utilizar sus propias variables en el script. Estas variables mantienen su valor hasta que el script termina de ejecutarse.

Al igual que con las variables del sistema, se puede acceder a las variables de 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 su activación en 7 días
#! / bin / bash # variables de prueba grado = 5 persona = "Adam" echo "$ persona es un buen chico, está en grado $ grado"
Esto es lo que sucede después de ejecutar un script de este tipo.


Variables personalizadas en un script

Sustitución de mando

Una de las características más útiles de los scripts de bash es la capacidad de extraer información de la salida de comandos y asignarla a variables, lo que permite que esta información se utilice en cualquier lugar del archivo de script.

Esto se puede hacer de dos formas.

  • Con la tilde ""
  • Usando el $ ()
Usando el primer enfoque, asegúrese de no usar una sola comilla en lugar de una comilla invertida. El comando debe estar encerrado en dos de estos íconos:

Mydir = `pwd`
En el segundo enfoque, lo mismo se escribe así:

Mydir = $ (pwd)
Y el guión, al final, puede verse así:

#! / bin / bash mydir = $ (pwd) echo $ mydir
Durante su funcionamiento, la salida del comando pwd se guardará en la variable mydir, cuyo contenido, usando el comando echo, irá a la consola.


Un script que almacena los resultados de un comando en una variable.

Operaciones matemáticas

Para realizar operaciones matemáticas en un archivo de script, puede usar una construcción como $ ((a + b)):

#! / bin / bash var1 = $ ((5 + 5)) echo $ var1 var2 = $ (($ var1 * 2)) echo $ var2


Operaciones matemáticas en un script

Constructo de control si-entonces

Algunos escenarios requieren el control del flujo de ejecución de comandos. Por ejemplo, si algún valor es mayor que cinco, debe realizar una acción, de lo contrario, otra. Esto es aplicable en muchas situaciones, y la construcción de control si-entonces nos ayudará aquí. En su forma más simple, se ve así:

Si el comando, entonces el comando fi
Y aquí hay un ejemplo práctico:

#! / bin / bash si pwd entonces echo "Funciona" fi
En este caso, si el comando pwd se completa con éxito, el texto "funciona" se mostrará en la consola.

Usemos nuestro conocimiento y escribamos un guión más complejo. Digamos que necesita encontrar un determinado usuario en / etc / passwd, y si puede encontrarlo, informe que existe.

#! / bin / bash user = likegeeks si grep $ user / etc / passwd entonces echo "El usuario $ user existe" fi
Esto es lo que sucede después de ejecutar este script.


Buscar un usuario

Aquí hemos utilizado el comando grep para encontrar al usuario en el archivo / etc / passwd. Si no está familiarizado con el comando grep, puede encontrar su descripción.

En este ejemplo, si se encuentra un usuario, el script mostrará un mensaje apropiado. ¿Qué pasa si no se puede encontrar al usuario? En este caso, el script simplemente terminará su ejecución sin decirnos nada. Me gustaría que él también nos hablara de 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 una falla, usaremos la construcción if-then-else. Así es como funciona:

Si comando, entonces comandos, más comandos comandos fi
Si el primer comando devuelve cero, lo que significa que se ejecutó correctamente, la condición será verdadera y la ejecución no seguirá a la rama else. De lo contrario, si se devuelve algo distinto de cero, lo que significa un error o un resultado falso, se ejecutarán los comandos posteriores al else.

Escribamos un guión como este:

#! / bin / bash user = anotherUser if grep $ user / etc / passwd then echo "El usuario $ user existe" else echo "El usuario $ user no existe" fi
Su ejecución fue por la rama else.


Ejecutar un script con una construcción if-then-else

Bueno, sigamos avanzando y preguntándonos por condiciones más difíciles. ¿Qué sucede si necesita verificar más de una condición, pero varias? Por ejemplo, si se encuentra el usuario deseado, debe mostrar un mensaje, si se cumple alguna otra condición, otro mensaje, etc. En tal situación, las condiciones anidadas nos ayudarán. Se parece a esto:

Si comando1 entonces comandos elif comando2 luego comandos fi
Si el primer comando devuelve cero, lo que indica su ejecución exitosa, se ejecutarán los comandos del primer bloque, de lo contrario, si la primera condición resulta ser falsa y si el segundo comando devuelve cero, el segundo bloque de código se ejecutará. ser ejecutado.

#! / bin / bash user = anotherUser if grep $ user / etc / passwd then echo "The user $ user Exists" elif ls / home then echo "El usuario no existe pero de todos modos hay un directorio bajo / home" fi
En tal secuencia de comandos, puede, por ejemplo, crear un nuevo usuario usando el comando useradd si la búsqueda no arrojó ningún resultado, o hacer algo más útil.

Comparación de números

Los valores numéricos se pueden comparar en secuencias de comandos. A continuación se muestra una lista de los comandos relevantes.
n1 -eq n2 Devuelve verdadero si n1 es igual a n2.
n1 -ge n2 Devuelve verdadero si n1 es mayor o igual que n2.
n1 -gt n2 Devuelve verdadero si n1 es mayor que n2.
n1 -le n2 Devuelve verdadero si n1 es menor o igual que n2.
n1 -lt n2 Devuelve verdadero si n1 es menor que n2.
n1 -ne n2 Devuelve verdadero si n1 no es igual a n2.

Probemos uno de los operadores de comparación como ejemplo. Tenga en cuenta que la expresión está entre corchetes.

#! / bin / bash val1 = 6 if [$ val1 -gt 5] then echo "El valor de prueba $ val1 es mayor que 5" else echo "El valor de prueba $ val1 no es mayor que 5" fi
Esto es lo que generará este comando.


Comparar números en guiones

El valor de la variable val1 es mayor que 5, como resultado, se ejecuta la rama entonces del operador de comparación y se muestra el mensaje correspondiente en la consola.

Comparación de cadenas

También puede comparar valores de cadena en scripts. Los operadores de comparación parecen bastante simples, pero las operaciones de comparación de cadenas tienen ciertas peculiaridades, que veremos a continuación. Aquí hay una lista de operadores.
str1 = str2 Prueba la igualdad de las cadenas, devuelve verdadero si las cadenas son idénticas.
s tr1! = str2 Devuelve verdadero si las cadenas no son idénticas.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 Devuelve verdadero si str1 es mayor que str2.
-n str1 Devuelve verdadero si str1 es mayor que cero.
-z str1 Devuelve verdadero si la longitud de str1 es cero.

A continuación, se muestra un ejemplo de comparación de cadenas en un script:

#! / bin / bash user = "likegeeks" if [$ user = $ USER] entonces echo "El usuario $ user es el usuario que ha iniciado sesión actualmente" fi
Como resultado de la ejecución del 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 "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>"Como comando de redirección de salida.

Así es como se ve trabajar con estos operadores en el código:

#! / bin / bash val1 = text val2 = "otro texto" if [$ val1 \>
Aquí están los resultados del guión.


Comparación de cadenas, advertencia emitida

Tenga en cuenta que el script, aunque se ejecuta, genera una advertencia:

./myscript: línea 5: [: demasiados argumentos
Para deshacerse de esta advertencia, incluya $ val2 entre comillas dobles:

#! / bin / bash val1 = text val2 = "otro texto" si [$ val1 \> "$ val2"] entonces echo "$ val1 es mayor que $ val2" si no echo "$ val1 es menor que $ val2" fi
Ahora todo funciona como debería.


Comparación de cadenas

Otra característica de los operadores ">" y "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likegeeks
Guardémoslo, dándole el nombre myfile, y luego ejecutemos el siguiente comando en la terminal:

Ordenar mi archivo
Ordenará las líneas del archivo de esta manera:

Likegeeks Likegeeks
El comando sort, por defecto, ordena las líneas 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] entonces echo "$ val1 es mayor que $ val2" si no echo "$ val1 es menor que $ val2" fi
Si lo ejecuta, resulta que lo contrario es cierto: la letra minúscula ahora es más grande que la mayúscula.


Ordenar la comparación de líneas y comandos en un archivo de secuencia de comandos

Los comandos de comparación tienen menos letras mayúsculas. La comparación de cadenas aquí se realiza comparando códigos de caracteres ASCII, por lo que el orden de clasificación depende de los códigos de caracteres.

El comando de clasificación, a su vez, utiliza el orden de clasificación especificado en la configuración de idioma del sistema.

Verificaciones de archivos

Los siguientes comandos son probablemente los más utilizados en scripts bash. Le permiten verificar varias condiciones con respecto a los archivos. Aquí hay una lista de estos comandos.
-d archivo Comprueba si un archivo existe y es un directorio.
-e archivo Comprueba si el archivo existe.
-f archivo Comprueba si el archivo existe y es un archivo.
-r archivo Comprueba si el archivo existe y es legible.
-s archivo Comprueba si el archivo existe y no está vacío.
-w archivo Comprueba si el archivo existe y se puede escribir.
-x archivo Comprueba si el archivo existe y es ejecutable.
file1 -nt file2 Comprueba si file1 es más reciente que file2.
file1 -ot file2 Comprueba si file1 es más antiguo que file2.
-O archivo Comprueba si el archivo existe y es propiedad del usuario actual.
-G archivo Comprueba 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 discutidos hoy, son fáciles de recordar. Sus nombres, al ser abreviaturas de varias palabras, indican directamente las comprobaciones que realizan.

Probemos uno de los comandos en la práctica:

#! / bin / bash mydir = / home / likegeeks if [-d $ mydir] then echo "El directorio $ mydir existe" cd $ mydir ls else echo "El directorio $ mydir no existe" fi
Este script, para un directorio existente, mostrará su contenido.


Salida del contenido de un directorio

Creemos que puede experimentar con el resto de los comandos por su cuenta, todos se aplican de la misma manera.

Resultados

Hoy cubrimos cómo comenzar 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 artículos. Si desea continuar ahora mismo, aquí hay una lista de los originales de estos materiales. Para mayor comodidad, esto incluye la traducción que acaba de leer.

Hoy hablaremos de scripts bash. Estos son scripts de línea de comandos escritos para el shell bash. Hay otras 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 la línea de comandos de Linux.



Los scripts de línea de comandos son colecciones de los mismos comandos que se pueden ingresar desde el teclado, ensamblar en archivos y unir por algún propósito común. Al mismo tiempo, los resultados del trabajo de los equipos pueden ser de valor independiente o servir como datos de entrada para otros equipos. La secuencia de comandos es una forma poderosa de automatizar las acciones que se realizan con frecuencia.

Entonces, si hablamos de la línea de comandos, te permite ejecutar varios comandos a la vez, ingresándolos separados por punto y coma:

Pwd; quién soy
De hecho, si lo ha probado en su terminal, su primer script bash que usa dos comandos ya ha sido escrito. Funciona así. Primero, el comando pwd muestra información sobre el directorio de trabajo actual, luego el comando whoami muestra información sobre el usuario con el que ha iniciado sesión.

Con este enfoque, puede combinar tantos comandos como desee en una línea, la limitación está solo en el número máximo de argumentos que se pueden pasar al programa. Puede determinar esta limitación utilizando el siguiente comando:

Getconf ARG_MAX
La línea de comandos es una gran herramienta, pero debe ingresar comandos cada vez que los necesite. ¿Qué pasa si escribe un montón de comandos en un archivo y simplemente llama a ese archivo para ejecutarlos? De hecho, el archivo del que estamos hablando se llama script de línea de comandos.

Cómo funcionan los scripts de bash

Cree un archivo vacío con el comando táctil. En su primera línea, necesitamos indicar qué shell vamos a usar. Estamos interesados ​​en bash, por lo que la primera línea del archivo será así:

#! / bin / bash
En otras líneas de este archivo, el carácter hash se usa para indicar comentarios que el shell no procesa. Sin embargo, la primera línea es un caso especial, aquí un hash seguido de un signo de exclamación (esta secuencia se llama shebang) y la ruta a bash indican al sistema que el script fue creado específicamente para bash.

Los comandos de shell están delimitados con avances de línea, los comentarios están delimitados con marcas de almohadilla. Así es como se ve:

#! / bin / bash # Este es un comentario pwd whoami
Aquí, además de en la línea de comandos, puede escribir comandos en una línea, separados por punto y coma. Sin embargo, escribir los comandos en líneas independientes facilita la lectura del archivo. En cualquier caso, el shell los procesará.

Configuración de permisos de archivo de secuencia de comandos

Guarde el archivo con el nombre myscript y casi habrá terminado de crear el script bash. Ahora todo lo que queda es hacer que este archivo sea ejecutable; de ​​lo contrario, al intentar ejecutarlo, se encontrará con el error Permiso denegado.


Intentando ejecutar un archivo de secuencia de comandos con permisos configurados incorrectamente

Hagamos que el archivo sea ejecutable:

Chmod + x ./myscript
Ahora intentemos ejecutarlo:

./myscript
Después de configurar los permisos, todo funciona como debería.


Ejecutando correctamente el script bash

Visualización de mensajes

El comando echo se usa para enviar texto a la consola de Linux. Aprovechemos el conocimiento de este hecho y editemos nuestro script, agregando explicaciones a los datos que muestran los comandos que ya están en él:

#! / bin / bash # nuestro comentario está aquí echo "El directorio actual es:" pwd echo "El usuario que inició sesión es:" whoami
Esto es lo que sucede después de ejecutar el script actualizado.


Visualización de mensajes de una secuencia de comandos

Ahora podemos imprimir leyendas explicativas usando el comando echo. Si no sabe cómo editar un archivo con herramientas de Linux, o no ha visto el comando echo antes, eche un vistazo a este recurso.

Usando Variables

Las variables le permiten almacenar información en un archivo de secuencia de comandos, por ejemplo, los resultados de los comandos que utilizarán otros comandos.

No hay nada de malo en ejecutar comandos individuales sin almacenar los resultados de su trabajo, pero las posibilidades de este enfoque son muy limitadas.

Hay dos tipos de variables que se pueden usar en scripts bash:

  • Variables de entorno
  • Variables de usuario

Variables de entorno

A veces, los comandos de shell necesitan trabajar con algunos datos del sistema. Por ejemplo, aquí se muestra cómo mostrar el directorio de inicio del usuario actual:

#! / bin / bash # mostrar el inicio del usuario echo "El inicio del usuario actual es: $ INICIO"
Tenga en cuenta que podemos usar la variable del sistema $ HOME entre comillas dobles, esto no evitará que el sistema la reconozca. Esto es lo que sucede si ejecuta el script anterior.


Usar una variable de entorno en un script

¿Qué sucede si desea mostrar el signo de dólar en la pantalla? Intentemos esto:

Echo "Tengo $ 1 en mi bolsillo"
El sistema detecta el signo de dólar en la cadena entre comillas y cree que hicimos referencia a una variable. El script intentará mostrar el valor de la variable indefinida $ 1. Esto no es lo que queremos. ¿Qué hacer?

Un carácter de escape con barra invertida antes del signo de dólar puede ayudar en esta situación:

Echo "Tengo \ $ 1 en mi bolsillo"
El script ahora generará exactamente lo que se espera.


Usar una secuencia de escape para generar un signo de dólar

Variables de usuario

Además de las variables de entorno, los scripts bash le permiten establecer y utilizar sus propias variables en el script. Estas variables mantienen su valor hasta que el script termina de ejecutarse.

Al igual que con las variables del sistema, se puede acceder a las variables de 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 su activación en 7 días
#! / bin / bash # variables de prueba grado = 5 persona = "Adam" echo "$ persona es un buen chico, está en grado $ grado"
Esto es lo que sucede después de ejecutar un script de este tipo.


Variables personalizadas en un script

Sustitución de mando

Una de las características más útiles de los scripts de bash es la capacidad de extraer información de la salida de comandos y asignarla a variables, lo que permite que esta información se utilice en cualquier lugar del archivo de script.

Esto se puede hacer de dos formas.

  • Con la tilde ""
  • Usando el $ ()
Usando el primer enfoque, asegúrese de no usar una sola comilla en lugar de una comilla invertida. El comando debe estar encerrado en dos de estos íconos:

Mydir = `pwd`
En el segundo enfoque, lo mismo se escribe así:

Mydir = $ (pwd)
Y el guión, al final, puede verse así:

#! / bin / bash mydir = $ (pwd) echo $ mydir
Durante su funcionamiento, la salida del comando pwd se guardará en la variable mydir, cuyo contenido, usando el comando echo, irá a la consola.


Un script que almacena los resultados de un comando en una variable.

Operaciones matemáticas

Para realizar operaciones matemáticas en un archivo de script, puede usar una construcción como $ ((a + b)):

#! / bin / bash var1 = $ ((5 + 5)) echo $ var1 var2 = $ (($ var1 * 2)) echo $ var2


Operaciones matemáticas en un script

Constructo de control si-entonces

Algunos escenarios requieren el control del flujo de ejecución de comandos. Por ejemplo, si algún valor es mayor que cinco, debe realizar una acción, de lo contrario, otra. Esto es aplicable en muchas situaciones, y la construcción de control si-entonces nos ayudará aquí. En su forma más simple, se ve así:

Si el comando, entonces el comando fi
Y aquí hay un ejemplo práctico:

#! / bin / bash si pwd entonces echo "Funciona" fi
En este caso, si el comando pwd se completa con éxito, el texto "funciona" se mostrará en la consola.

Usemos nuestro conocimiento y escribamos un guión más complejo. Digamos que necesita encontrar un determinado usuario en / etc / passwd, y si puede encontrarlo, informe que existe.

#! / bin / bash user = likegeeks si grep $ user / etc / passwd entonces echo "El usuario $ user existe" fi
Esto es lo que sucede después de ejecutar este script.


Buscar un usuario

Aquí hemos utilizado el comando grep para encontrar al usuario en el archivo / etc / passwd. Si no está familiarizado con el comando grep, puede encontrar su descripción.

En este ejemplo, si se encuentra un usuario, el script mostrará un mensaje apropiado. ¿Qué pasa si no se puede encontrar al usuario? En este caso, el script simplemente terminará su ejecución sin decirnos nada. Me gustaría que él también nos hablara de 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 una falla, usaremos la construcción if-then-else. Así es como funciona:

Si comando, entonces comandos, más comandos comandos fi
Si el primer comando devuelve cero, lo que significa que se ejecutó correctamente, la condición será verdadera y la ejecución no seguirá a la rama else. De lo contrario, si se devuelve algo distinto de cero, lo que significa un error o un resultado falso, se ejecutarán los comandos posteriores al else.

Escribamos un guión como este:

#! / bin / bash user = anotherUser if grep $ user / etc / passwd then echo "El usuario $ user existe" else echo "El usuario $ user no existe" fi
Su ejecución fue por la rama else.


Ejecutar un script con una construcción if-then-else

Bueno, sigamos avanzando y preguntándonos por condiciones más difíciles. ¿Qué sucede si necesita verificar más de una condición, pero varias? Por ejemplo, si se encuentra el usuario deseado, debe mostrar un mensaje, si se cumple alguna otra condición, otro mensaje, etc. En tal situación, las condiciones anidadas nos ayudarán. Se parece a esto:

Si comando1 entonces comandos elif comando2 luego comandos fi
Si el primer comando devuelve cero, lo que indica su ejecución exitosa, se ejecutarán los comandos del primer bloque, de lo contrario, si la primera condición resulta ser falsa y si el segundo comando devuelve cero, el segundo bloque de código se ejecutará. ser ejecutado.

#! / bin / bash user = anotherUser if grep $ user / etc / passwd then echo "The user $ user Exists" elif ls / home then echo "El usuario no existe pero de todos modos hay un directorio bajo / home" fi
En tal secuencia de comandos, puede, por ejemplo, crear un nuevo usuario usando el comando useradd si la búsqueda no arrojó ningún resultado, o hacer algo más útil.

Comparación de números

Los valores numéricos se pueden comparar en secuencias de comandos. A continuación se muestra una lista de los comandos relevantes.
n1 -eq n2 Devuelve verdadero si n1 es igual a n2.
n1 -ge n2 Devuelve verdadero si n1 es mayor o igual que n2.
n1 -gt n2 Devuelve verdadero si n1 es mayor que n2.
n1 -le n2 Devuelve verdadero si n1 es menor o igual que n2.
n1 -lt n2 Devuelve verdadero si n1 es menor que n2.
n1 -ne n2 Devuelve verdadero si n1 no es igual a n2.

Probemos uno de los operadores de comparación como ejemplo. Tenga en cuenta que la expresión está entre corchetes.

#! / bin / bash val1 = 6 if [$ val1 -gt 5] then echo "El valor de prueba $ val1 es mayor que 5" else echo "El valor de prueba $ val1 no es mayor que 5" fi
Esto es lo que generará este comando.


Comparar números en guiones

El valor de la variable val1 es mayor que 5, como resultado, se ejecuta la rama entonces del operador de comparación y se muestra el mensaje correspondiente en la consola.

Comparación de cadenas

También puede comparar valores de cadena en scripts. Los operadores de comparación parecen bastante simples, pero las operaciones de comparación de cadenas tienen ciertas peculiaridades, que veremos a continuación. Aquí hay una lista de operadores.
str1 = str2 Prueba la igualdad de las cadenas, devuelve verdadero si las cadenas son idénticas.
s tr1! = str2 Devuelve verdadero si las cadenas no son idénticas.
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1> str2 Devuelve verdadero si str1 es mayor que str2.
-n str1 Devuelve verdadero si str1 es mayor que cero.
-z str1 Devuelve verdadero si la longitud de str1 es cero.

A continuación, se muestra un ejemplo de comparación de cadenas en un script:

#! / bin / bash user = "likegeeks" if [$ user = $ USER] entonces echo "El usuario $ user es el usuario que ha iniciado sesión actualmente" fi
Como resultado de la ejecución del 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 "<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>"Como comando de redirección de salida.

Así es como se ve trabajar con estos operadores en el código:

#! / bin / bash val1 = text val2 = "otro texto" if [$ val1 \>
Aquí están los resultados del guión.


Comparación de cadenas, advertencia emitida

Tenga en cuenta que el script, aunque se ejecuta, genera una advertencia:

./myscript: línea 5: [: demasiados argumentos
Para deshacerse de esta advertencia, incluya $ val2 entre comillas dobles:

#! / bin / bash val1 = text val2 = "otro texto" si [$ val1 \> "$ val2"] entonces echo "$ val1 es mayor que $ val2" si no echo "$ val1 es menor que $ val2" fi
Ahora todo funciona como debería.


Comparación de cadenas

Otra característica de los operadores ">" y "<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likegeeks
Guardémoslo, dándole el nombre myfile, y luego ejecutemos el siguiente comando en la terminal:

Ordenar mi archivo
Ordenará las líneas del archivo de esta manera:

Likegeeks Likegeeks
El comando sort, por defecto, ordena las líneas 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] entonces echo "$ val1 es mayor que $ val2" si no echo "$ val1 es menor que $ val2" fi
Si lo ejecuta, resulta que lo contrario es cierto: la letra minúscula ahora es más grande que la mayúscula.


Ordenar la comparación de líneas y comandos en un archivo de secuencia de comandos

Los comandos de comparación tienen menos letras mayúsculas. La comparación de cadenas aquí se realiza comparando códigos de caracteres ASCII, por lo que el orden de clasificación depende de los códigos de caracteres.

El comando de clasificación, a su vez, utiliza el orden de clasificación especificado en la configuración de idioma del sistema.

Verificaciones de archivos

Los siguientes comandos son probablemente los más utilizados en scripts bash. Le permiten verificar varias condiciones con respecto a los archivos. Aquí hay una lista de estos comandos.
-d archivo Comprueba si un archivo existe y es un directorio.
-e archivo Comprueba si el archivo existe.
-f archivo Comprueba si el archivo existe y es un archivo.
-r archivo Comprueba si el archivo existe y es legible.
-s archivo Comprueba si el archivo existe y no está vacío.
-w archivo Comprueba si el archivo existe y se puede escribir.
-x archivo Comprueba si el archivo existe y es ejecutable.
file1 -nt file2 Comprueba si file1 es más reciente que file2.
file1 -ot file2 Comprueba si file1 es más antiguo que file2.
-O archivo Comprueba si el archivo existe y es propiedad del usuario actual.
-G archivo Comprueba 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 discutidos hoy, son fáciles de recordar. Sus nombres, al ser abreviaturas de varias palabras, indican directamente las comprobaciones que realizan.

Probemos uno de los comandos en la práctica:

#! / bin / bash mydir = / home / likegeeks if [-d $ mydir] then echo "El directorio $ mydir existe" cd $ mydir ls else echo "El directorio $ mydir no existe" fi
Este script, para un directorio existente, mostrará su contenido.


Salida del contenido de un directorio

Creemos que puede experimentar con el resto de los comandos por su cuenta, todos se aplican de la misma manera.

Resultados

Hoy cubrimos cómo comenzar 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 artículos. Si desea continuar ahora mismo, aquí hay una lista de los originales de estos materiales. Para mayor comodidad, esto incluye la traducción que acaba de leer. Si aún no conoce pCloud, puede leerlo.

PCloud para Linux ofrece una aplicación de sincronización para Linux como una imagen de aplicación (la última versión está disponible). La solución a la aparentemente simple cuestión de automatizar el proceso "iniciar el cliente - sincronizar - apagar el cliente" llevó a la necesidad de resolver varios problemas relacionados con las peculiaridades del cliente pCloud. La solución se da para el entorno gráfico xfce.

En última instancia, la solución para automatizar la automatización del proceso resultó en el lanzamiento de dos o tres tareas en un horario (ver).

Lanzamiento del cliente pCloud

Se utiliza un script simple para iniciar el cliente, por ejemplo pcloud1.sh

#! / bin / bash
/ ruta_al_archivo / pcloud

Y el comando de tarea personalizada es

Exportar DISPLAY =: 0 && /path/pcloud1.sh

Ruta: la ruta al script pcloud1.sh

Agregar inicialmente una línea de salida a pcloud1.sh (completando pcloud1.sh) no produjo el resultado deseado. Se observaron 2 procesos en el administrador de tareas:

Pcloud1.sh
sh -c exportar DISPLAY =: 0 && /path/pcloud1.sh

Para evitar que pcloud1.sh se "cuelgue" en el administrador de tareas, se creó el script pcloud2.sh, que se inicia en un horario un minuto después de iniciar pcloud1.sh El script es una "solicitud" para terminar todos los procesos existentes con el nombre pcloud1.sh

#! / bin / bash
killall -s TERM pcloud1.sh
dormir 1 && salir

Detención del cliente pCloud

Este script, desde el punto de vista de su creación, fue el que consumió más tiempo, lo que se explica por dos razones.

Pregunta 1. El trabajo del cliente comenzó a ir acompañado de varios procesos. Por ejemplo, cuando inicia el cliente y luego abre automáticamente todas las ventanas en el administrador de tareas, puede ver 6 procesos de pcloud:


Después de cerrar la ventana principal del cliente y la instancia del administrador de archivos que muestra el contenido de la nube de pCloudDrive, 5 procesos de pcloud permanecerán en el administrador de tareas:


Dado que no hay un comando de terminal para apagar el cliente, puede aplicar la solución para terminar "suavemente" el proceso pcloud por su valor pid, es decir, con el comando kill -15 pid_pcloud

Pero si solicita el pid del proceso pcloud, el resultado serán 6 grupos de números correspondientes a los pids de los procesos pcloud (ejemplo: 16129 16103 16077 16048 16036 16032), o 5 grupos (ejemplo: 29419 29398 29352 29324 29320). Estos valores pid cambiarán cada vez.

El número de procesos (5 o 6) depende de si ha abierto todas las ventanas que se abren automáticamente cuando se inicia el cliente, o si estas ventanas están cerradas y solo el icono de estado en el soporte del escritorio (panel del sistema, bandeja) está activo.

Surge una pregunta natural: ¿qué proceso debería desactivarse?

Pregunta 2. Cuando se inicia el cliente de pCloud, se abren automáticamente 2 ventanas, una de las cuales es una ventana de cliente, y la segunda es una instancia del administrador de archivos correspondiente al directorio abierto de pCloudDrive, cuyo contenido es el contenido del espacio en la nube de la cuenta de pCloud montado en él, por ejemplo:



Si, después de cerrar el cliente pCloud, la ventana del cliente (figura superior) desaparece, la segunda ventana permanecerá abierta. El contenido de la segunda ventana estará en blanco, ya que la nube pCloud fue desmontada durante el cierre del cliente.

Pregunta: ¿y cómo cerrarlo automáticamente?

Nota. No se plantea la cuestión de cerrar la ventana abierta de la aplicación pCloud, ya que en xfce el icono en el panel (bandeja del sistema, bandeja) muestra solo el estado "sincronizado" o "sincronizado". La información sobre la cantidad de archivos cargados o descargados, así como la velocidad del proceso, se muestra en la parte inferior de la ventana abierta de la aplicación pCloud.

Responderemos a las preguntas planteadas de forma secuencial.

Respuesta 1. Se encontró experimentalmente que para salir del cliente pcloud, es necesario apagar el proceso pcloud con el valor pid más bajo, que corresponde al proceso pCloud Drive (ver el administrador de tareas). Por tanto, la tarea más difícil de la automatización será seleccionar el pid más pequeño de los valores obtenidos, para luego asignarlo a una variable.

Al final resultó que, este problema se puede resolver de al menos cuatro formas. Además, el apagado "suave" de todos los procesos de pcloud se puede realizar con el comando killall especificando el nombre del proceso. Dado que todas las soluciones, de las cuales 5 están escritas, conducen al mismo resultado, se enumeran a continuación.

Opción 1: killall -s TERM pcloud

Aquí todo está claro. Se emite un comando para terminar todos los procesos de pcloud.

Los siguientes tres métodos son una serie de operaciones secuenciales. Primero, los valores pid de todas las instancias de pcloud se recuperan y se escriben en un archivo (por ejemplo, pcloud.txt). El contenido del archivo es una secuencia de 5 o 6 grupos de números (ver explicación arriba). Luego, el último grupo (5 dígitos) de la serie resultante de valores pid se "captura" y se asigna a una variable (por ejemplo, VAR). El último paso es ejecutar el comando kill -15 $ VAR, que es lo mismo que ejecutar kill -15 con el valor pid más bajo del archivo pcloud.txt.

2, 3, 4 opciones:
pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | grep -o * $ `
matar -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | awk "(imprimir $ NF)" `
matar -15 $ VAR

Pidof pcloud> ~ / pcloud.txt
VAR = `cat ~ / pcloud.txt | rev | cortar -d "" -f 1 | Rdo
matar -15 $ VAR

Los usuarios del foro Linuxmint.com.ru sugirieron las variantes 1–4 con los apodos slant (2), Chocobo (3 y 4), demonlibra (1). Aprovechando esta oportunidad, me gustaría expresarles una vez más mi gratitud.

Opcion 5

Al obtener una lista de procesos pid pcloud con el comando pgrep, el resultado en el archivo pcloud.txt se presentará en una columna, es decir, cada valor pid se ubicará en una nueva línea en orden ascendente, por ejemplo:

29320
29324
29352
29398
29419

El siguiente paso es asignar a la variable el valor de la primera línea del archivo pcloud.txt.

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 1p "~ / pcloud.txt`
matar -15 $ VAR

Respuesta 2. A pesar de la aparente simplicidad del comando para cerrar la ventana activa de Thunar con el comando thunar -q (obtenido después de ejecutar thunar --help en la terminal), en este caso no funciona.

Después de examinar el árbol de procesos, se encontró que hay Thunar --daemon en la lista de procesos activos:


Hay tres formas de cerrar la ventana de Thunar abierta por el cliente pCloud:

A) matar todos los procesos Thunar activos killall -s TERM / usr / bin / Thunar;

B) obtenga el pid del proceso Thunar, escríbalo en una variable y finalícelo con el comando kill -15 variable_value

SALIDA = "$ (pidof / usr / bin / thunar)"
matar -15 $ (SALIDA)

C) obtener el pid del proceso Thunar, escribirlo en un archivo, asignar a la variable el valor obtenido al leer el archivo y finalizarlo con el comando kill -15 variable_value

Pidof / usr / bin / Thunar> ~ / thunar.txt
VAR2 = `gato ~ / thunar.txt`
matar -15 $ VAR2

Todas las opciones son iguales. El resultado de su ejecución es la terminación de los procesos thunar --daemon y Thunar (corresponde a una ventana abierta con el contenido del directorio pCloudDrive).

Sobre la cuestión de la "importancia" del proceso thunar - daemon en el foro de habla inglesa, se encontró información de que esto no afecta significativamente la funcionalidad de Thunar y el sistema en su conjunto. El único inconveniente es que sin este proceso, los medios extraíbles conectados (por ejemplo, una unidad flash) se montarán automáticamente solo cuando la ventana de Thunar esté abierta. Si no se está ejecutando ninguna instancia de Thunar, los medios extraíbles no se montan automáticamente. En este caso, debe abrir Thunar y montarlo manualmente, por ejemplo:


En cualquier caso, después del próximo inicio del sistema, thunar --daemon se iniciará automáticamente


lo que está determinado por el contenido del archivo

/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml (ver --daemon)



En total, el script para cerrar el cliente pCloud (por ejemplo, pcloud3.sh) puede ser el siguiente (se selecciona una opción y un método):

#! / bin / bash
opción 1, 2, 3, 4, 5
dormir 5
método a, b, c
dormir 5 && salir

El comando de pausa de 5 segundos slеep 5 se introdujo para probar el script para monitorear procesos. No tiene que usarlo en un script de trabajo.

Ejemplo de trabajo cron personalizado para sincronización automática diaria de 40 minutos con pCloud de 21:40 a 22:20

40 21 * * * exportar DISPLAY =: 0 && /home/user/Tools/scripts/pcloud1.sh
41 21 * * * /home/user/Tools/scripts/pcloud2.sh

Si nos limitamos solo a los scripts de inicio y apagado, es decir, pcloud1.sh y pcloud3.sh, entonces el script pcloud3.sh debería apagar pcloud con el proceso pid no el más pequeño, sino uno más, es decir, desde el serie de valores obtenidos, por ejemplo,

28354 28355 28359 28371 28399 28426 28449 28684 ,

Se debe seleccionar el segundo (28355). La explicación es que 28354 corresponde al script activo pcloud1.sh.

En consecuencia, en este caso, se utilizará el siguiente código para cerrar los procesos de pcloud:

Pgrep pcloud> ~ / pcloud.txt
VAR = `sed -n" 2p "~ / pcloud.txt`
matar -15 $ VAR

Luego, la tarea personalizada toma la forma, por ejemplo:

40 21 * * * exportar DISPLAY =: 0 && /home/user/Tools/scripts/pcloud1.sh
20 22 * ​​* * /home/user/Tools/scripts/pcloud3.sh

En primer lugar, echemos un vistazo a lo que es texto Y, para qué es esto.

Texto traducido del inglés - guión... Todos vemos películas, muchos de nosotros vemos actuaciones. Para crear una película / obra de teatro, los guionistas escriben guiones para ellos, sobre la base de los cuales los actores, escena por escena, interpretan sus papeles en el escenario, que constituye la película / obra. El trabajo de creación del guión es bastante minucioso, donde hay que tener en cuenta todo hasta el más mínimo detalle, para que al final los artistas puedan cumplir el plan del guionista y el espectador vea la obra completa.

Asimismo, se escriben scripts para realizar una lista de tareas que el usuario arma (código) para hacerlas más fáciles y rápidas en el sistema operativo. No es necesario tener una educación de programador para escribir scripts simples.

Primero, creemos el más simple script-shell para actualizar el sistema.

Realizaré todas las acciones con el sistema. Ubuntu pero también son aplicables a otros sistemas Linux derivado de Ubuntu... Para esto necesitamos: Editor de texto para llenarlo con las tareas necesarias para crear un script (código) y Terminal- para ejecutar el script creado. Estas herramientas se instalan en cualquier distribución. Linux defecto.

Entonces, abre un editor de texto Gedit e ingrese los primeros caracteres requeridos debajo del nombre el asunto.
el asunto en programación, es una secuencia de dos caracteres: un hash y un signo de exclamación ( #! ) al principio del archivo de script. Y agregue a estos caracteres sin espacios / bin / sh- el intérprete donde se ejecutará el script. / bin / sh- esto suele ser Cáscara de Bourne o un intérprete de línea de comandos compatible que pasa "ruta / a / script" como primer parámetro.
La primera línea requerida del script se verá así:

# Mi primer script de actualización de Ubuntu

El signo de almohadilla (#) al principio de la línea le deja en claro al intérprete / terminal que esta línea no necesita ser leída y ejecutada. La línea es necesaria en el código de este script para que el propio creador del script sepa qué va a ejecutar en un segmento / escena determinado en el código, para no confundirse en el futuro cuando haya muchas de esas líneas. . Tales líneas con un signo de almohadilla se llaman: Comentado .

actualización de sudo apt
actualización de sudo apt -y

-y al final del segundo comando deja claro al intérprete / terminal que esta acción / comando debe realizarse automáticamente, sin confirmación adicional por parte del usuario, presionando una tecla Aporte. y- abreviado del inglés , es decir. .

Eso es todo. Se ha creado su primer guión. Debería tener algo como la imagen:


Queda por guardar el archivo / script creado y darle Nombre con una extensión requerida al final - .sh... Extensión .sh asignado al archivo ejecutable.
Le dí Nombre - update.sh ahorrando en Carpeta de inicio usuario:


Para que el archivo / script creado sea ejecutable, debe tener permiso para hacerlo. Esto se puede hacer de dos formas.

1. Ejecute el siguiente comando en la terminal:

sudo chmod + x update.sh

2. O abre el administrador de archivos en Carpeta de inicio(donde guardó el script generado), haga clic derecho en el archivo, en el menú contextual - Propiedades - Derechos y activar el artículo - Rendimiento: Permita que el archivo se ejecute como un programa:


Para ejecutar el script creado, debe abrir una terminal (sobre la que escribí al principio del artículo, que el terminal es un atributo / herramienta necesaria para ejecutar el script), ingrese sh, el nombre del script está separado por un espacio - update.sh y presione la tecla Aporte:


O en la terminal entramos sh y arrastre el archivo creado con el script desde el administrador de archivos (también separado por un espacio):


Después de que se muestre la ruta del archivo después del comando sh y un espacio, solo presione la tecla Ingresar(Entrar) para actualizar el sistema:


Ahora, en cualquier momento, puede realizar una actualización del sistema creada por su propio script.

Sí, alguien puede argumentar que actualizar el sistema no es difícil de hacer ejecutando estos dos comandos en la terminal, ¿por qué inflar y crear algunos scripts? Eso está bien. Pero este es un ejemplo de cómo crear un guión simple para mostrar que "no son los dioses los que queman ollas".

Escribir scripts en Linux (aprender con el ejemplo)

———————————————————————————-

1. Introducción

Que necesitas para escribir guiones
Competencia en herramientas de línea de comandos y sus opciones requeridas.
El conocimiento básico de inglés a nivel de la escuela primaria no vendrá mal.

¿Por qué se necesitan los scripts?
Primero, la administración de un servidor Linux, en un grado u otro, se reduce a la ejecución sistemática de los mismos comandos. Además, no es necesario que estos comandos los realice una persona. Se pueden programar para que sean ejecutados por la máquina.
En segundo lugar, incluso simplemente realizando una tarea común, que (de repente) asciende a 20-1000 ... las operaciones repetitivas son MUCHO más fáciles de implementar en un script.

Que es un guion
Un script es un conjunto de instrucciones que una computadora debe ejecutar en un orden específico y en un momento específico. Las instrucciones pueden ser comandos de shell internos (bucles, condiciones, procesamiento de información de texto, trabajo con variables de entorno, etc.) o cualquier programa que ejecutemos en la consola con los parámetros necesarios.

Cómo escribir un guión
En nuestro caso, el script será un archivo de texto con atributos de ejecución. Si el archivo de script comienza con #!, Que se llama sha-bang en el mundo UNIX, esto le dice al sistema qué intérprete utilizar para ejecutar el script. Si esto es difícil de entender, entonces recuerde que comenzaremos a escribir todos los scripts exactamente desde la línea #! / Bin / bash o #! / Bin / sh, y luego seguirán los comandos y comentarios.

Palabras de despedida
Le recomiendo sinceramente que escriba tantos comentarios como sea posible en casi todas las líneas del guión. Pasará el tiempo y deberá cambiar o modernizar el guión escrito una vez. Si no recuerda o no comprende lo que está escrito en el guión, entonces será difícil cambiarlo, es más fácil escribir desde cero.

Qué scripts podríamos necesitar:

    establecer reglas de firewall cuando se inicia el sistema.
    realizar una copia de seguridad de la configuración y los datos.
    agregar buzones de correo al servidor de correo (más precisamente a la base de datos mysql)
    que inicia a una hora determinada (preferiblemente todas las noches) un programa que escanea los registros del servidor proxy y genera un informe web conveniente sobre la cantidad de tráfico descargado.
    enviándonos por correo información de que alguien ha accedido a nuestro servidor a través de ssh, el tiempo de conexión y la dirección del cliente.

Acerca de las técnicas de creación de scripts
Creamos un archivo de texto, lo editamos, establecemos derechos de ejecución, ejecutamos, verificamos errores, arreglamos, ejecutamos, verificamos errores ...
Cuando todo está lamido y funcionando correctamente, lo ponemos en carga automática o en el programador durante un tiempo determinado.

———————————————————————————-

2. Aprender a escribir guiones en el lenguaje BASH interno
original: https://www.linuxconfig.org/Bash_scripting_Tutorial

Este tutorial no asume ningún conocimiento previo de las técnicas de scripting (scripting) que utilizan el lenguaje Bash interno. Con este tutorial, pronto descubrirá que la creación de scripts es una tarea muy sencilla. Comencemos nuestro tutorial con un script simple que genera la cadena "¡Hola mundo!" (en traducción del inglés - ¡Hola a todos!)

1. Situación "Hola a todos"
Aquí está su primer ejemplo de script de bash:

#! / bin / bash
echo "Hola mundo"

Vaya al directorio que contiene nuestro archivo hello_world.sh y hágalo ejecutable:

Código: seleccione todo $ chmod + x hello_world.sh

Ejecute el script para su ejecución

Código: Seleccionar todo $ ./hello_world.sh

2. Un sencillo script de bash para archivar

#! / bin / bash
tar -czf myhome_directory.tar.gz / home / user

Código: Seleccionar todo $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Trabajar con variables
En este ejemplo, declaramos una variable simple y la imprimimos en la pantalla usando el comando echo

#! / bin / bash
STRING = "¡¡¡HOLA MUNDO !!!"
echo $ STRING

Código: Seleccionar todo $ ./hello_world.sh
HOLA MUNDO !!!

Nuestro script de archivo con variables:

#! / bin / bash
OF = myhome_directory _ $ (fecha +% Y% m% d) .tar.gz
SI = / inicio / usuario
tar -czf $ OF $ SI

Código: Seleccionar todo $ ./backup.sh
tar: Eliminando "\" inicial de los nombres de los miembros
$ du -sh * tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Variables globales y locales

#! / bin / bash
# Declarar una variable global
# Dicha variable se puede utilizar en cualquier lugar de este script.
VAR = "variable global"
función bash
# Declarar una variable local
# Tal variable solo es válida para la función en la que fue declarada
local VAR = "variable local"
echo $ VAR
}
echo $ VAR
intento
# Tenga en cuenta que la variable global no ha cambiado
echo $ VAR

Código: seleccione todos los $ ./variables.sh
variable global
variable local
variable global

4. Pasar argumentos al guión

#! / bin / bash
# Usa variables predefinidas para acceder a argumentos
# Mostrar argumentos en la pantalla
echo $ 1 $ 2 $ 3 '-> echo $ 1 $ 2 $ 3'

# También podemos acceder a los argumentos a través de la matriz especial args = (“ [correo electrónico protegido]»)
# Mostrar argumentos en la pantalla
echo $ (argumentos) $ (argumentos) $ (argumentos) "-> argumentos = (" [correo electrónico protegido]"); echo $ (argumentos) $ (argumentos) $ (argumentos) '

# Usa una variable [correo electrónico protegido] para generar todos los argumentos a la vez
eco [correo electrónico protegido]‘-> echo [correo electrónico protegido]

Utilice la variable $ # para mostrar el número de argumentos pasados ​​al script
echo Número de argumentos pasados: $ # '-> echo Número de argumentos pasados: $ #'

Código: seleccione todo $ ./arguments.sh Bash Scripting Tutorial
Tutorial Bash Scripting -> echo $ 1 $ 2 $ 3
Tutorial Bash Scripting -> args = (" [correo electrónico protegido]"); echo $ (argumentos) $ (argumentos) $ (argumentos)
Tutorial Bash Scripting -> echo [correo electrónico protegido]
Número de argumentos pasados: 3 -> echo Número de argumentos pasados: $ #

5. Ejecución de comandos de shell en un script

#! / bin / bash
# use comillas inversas "" "" para ejecutar el comando de shell
echo `uname -o`
# ahora intentemos sin comillas
echo uname -o

Código: Seleccionar todo $ uname -o
GNU / Linux
$ ./bash_backtricks.sh
GNU / Linux
uname -o

Como puede ver, en el segundo caso, se mostró el comando en sí, y no el resultado de su ejecución.

6. Leer la entrada del usuario (interactividad)

#! / bin / bash
echo -e "Hola, escribe la palabra: \ c"
leer palabra
echo "La palabra que ingresaste es: $ palabra"
echo -e “¿Puede introducir dos palabras? "
leer palabra1 palabra2
echo "Aquí está su entrada: \" $ palabra1 \ "\" $ palabra2 \ ""
echo -e “¿Cómo te sientes acerca de las secuencias de comandos bash? "
# El comando de lectura ahora almacena una respuesta en la variable incorporada predeterminada $ REPLY
leer
echo “Dijiste $ REPLY, ¡me alegra escuchar eso! "
echo -e “¿Cuáles son tus colores favoritos? "
# -a hace un comando de lectura para leer en una matriz
leer -a colores
echo "Mis colores favoritos también son $ (colores), $ (colores) y $ (colores) :-)"

Código: seleccione todo $ ./read.sh
Hola, escribe la palabra: algo
La palabra que ingresaste es: algo
¿Puede ingresar dos palabras?
Debian Linux
Aquí está su entrada: "Debian" "Linux"
¿Qué opinas de las secuencias de comandos bash?
bien
¡Dijiste bien, me alegro de escuchar eso!
¿Cuáles son tus colores favoritos?
azul verde negro
Mis colores favoritos también son el azul, el verde y el negro :-)

7. Usando una trampa

#! / bin / bash
# declarar una trampa
trampa bashtrap INT
# limpiar la pantalla
claro;
# la función de gancho se ejecuta cuando el usuario presiona CTRL-C:
# La pantalla mostrará => Ejecutando la subrutina bash trap!
# pero el script continuará ejecutándose
bashtrap ()
{
echo "¡CTRL + C detectado! ... ¡ejecutando bash trap!"
}
# script contará hasta 10
para a en `seq 1 10`; hacer
echo "$ a / 10 para salir".
dormir 1;
hecho
echo "¡¡¡Ejemplo de Exit Bash Trap !!!"

Código: Seleccionar todo $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL + C Detectado! ... ejecutando bash trap!
10/10
¡¡¡Ejemplo de Exit Bash Trap !!!

Como puede ver, la combinación de teclas Ctrl-C no detuvo la ejecución del script.

8. Matrices
8.1 Declarar una matriz simple

#! / bin / bash
# Declare una matriz simple con 4 elementos
ARRAY = ("Debian Linux" "" Redhat Linux "Ubuntu Linux)
# Obtenga la cantidad de elementos en la matriz
ELEMENTS = $ (# ARRAY [@])

# salida en un bucle cada elemento de la matriz
para ((i = 0; i<$ELEMENTS;i++)); do
echo $ (ARRAY [$ (i)])
hecho

Código: Seleccione todo $. / Arrays.sh
Debian Linux
Redhat Linux
Ubuntu
Linux

8.2 Rellenar la matriz con valores del archivo

#! / bin / bash
# Declarar una matriz
declare -a ARRAY
# Comando Exec # stdin (normalmente el teclado) se generará a partir de este archivo. Esto hace posible leer
# el contenido del archivo, línea por línea, y analice cada línea ingresada con sed y / o awk.
ejecutivo 10 vamos a contar = 0

mientras lee LINE<&10; do

ARRAY [$ count] = $ LINE
((cuenta ++))
hecho

echo Número de elementos: $ (# ARRAY [@])
# Salida de valores de matriz
echo $ (ARRAY [@])
# cerrar el archivo
ejecutivo 10> & -

Código: seleccione todo $ cat bash.txt
Debian Linux
Redhat Linux
Ubuntu
Linux
$ ./arrays.sh
Número de elementos: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Condiciones en caso contrario
9.1. Uso simple de condiciones "si-no"
Preste atención a los espacios entre corchetes, sin los cuales la condición no funcionará.

#! / bin / bash
directorio = "./ BashScripting"

# comprobar si el directorio existe
if [-d $ directorio]; luego
echo "El directorio existe"
demás
echo "El directorio no existe"
fi

Código: Seleccionar todo $ ./if_else.sh
El directorio no existe
$ mkdir BashScripting
$ ./if_else.sh
El directorio existe

9.2 Condiciones anidadas en caso contrario

#! / bin / bash
# Declara una variable con el valor 4
elección = 4
# Visualización
echo "1. Bash "
echo "2. Secuencias de comandos "
echo "3. Tutorial "

# Ejecutar hasta que la variable sea cuatro
# Bucle
while [$ elección -eq 4]; hacer

# leer la entrada del usuario
leer elección
# condición anidada si-no
if [$ elección -eq 1]; luego

echo "Has elegido la palabra: Bash"

if [$ elección -eq 2]; luego
echo "Has elegido la palabra: Scripting"
demás

if [$ elección -eq 3]; luego
echo "Has elegido la palabra: Tutorial"
demás
echo "¡Por favor, elija entre 1-3!"
echo "1. Bash "
echo "2. Secuencias de comandos "
echo "3. Tutorial "
echo -n “Por favor, elija una palabra? "
elección = 4
fi
fi
fi
hecho

Código: seleccione todo $ ./nested.sh
1. Bash
2. Scripting
3. Tutorial

5

1. Bash
2. Scripting
3. Tutorial
Por favor, elija una palabra.
4
¡Elija entre 1 y 3!
1. Bash
2. Scripting
3. Tutorial
Por favor, elija una palabra.
3
Has elegido la palabra: Tutorial

Así, al principio, se ejecuta el cuerpo del bucle "while", ya que la elección de la variable es inicialmente igual a cuatro. Luego leemos la entrada del usuario en él, y si la entrada no es igual a 1.2 o 3, entonces hacemos que nuestra variable sea igual a 4 nuevamente, en relación con lo cual se repite el cuerpo del bucle (nuevamente es necesario ingresar 1.2 o 3).

10. Comparaciones
10.1 Comparaciones aritméticas

Teniente<
-gt>
-le<=
-ge> =
-eq ==
-ne! =

#! / bin / bash

NUM1 = 2
NUM2 = 2
si [$ NUM1 -eq $ NUM2]; luego
echo "Ambos valores son iguales"
demás
echo "Los valores NO son iguales"
fi

Código: Seleccionar todo $ ./equals.sh
Ambos valores son iguales

#! / bin / bash
# Declarar variables con valores enteros
NUM1 = 2
NUM2 = 3
si [$ NUM1 -eq $ NUM2]; luego
echo "Ambos valores son iguales"
demás
echo "Los valores NO son iguales"
fi

Código: Seleccionar todo $ ./equals.sh
Los valores NO son iguales

#! / bin / bash
# Declarar variables con valores enteros
NUM1 = 2
NUM2 = 1
si [$ NUM1 -eq $ NUM2]; luego
echo "Ambos valores son iguales"
elif [$ NUM1 -gt $ NUM2]; luego
echo "$ NUM1 es mayor que $ NUM2"
demás
echo "$ NUM2 es mayor que $ NUM1"
fi

Código: Seleccionar todo $ ./equals.sh
2 es mayor que 1

10.2 Comparaciones de texto simbólico

Lo mismo
! = no es lo mismo
< меньще чем
> más de
-n s1 variable s1 no está vacía
-z s1 variable s1 está vacía

#! / bin / bash

S1 = "Bash"

S2 = "Secuencias de comandos"
si [$ S1 = $ S2]; luego

demás
echo "Las cadenas NO son iguales"
fi

Código: Seleccionar todo $ ./statement.sh
Las cadenas NO son iguales

#! / bin / bash
# Declare la variable simbólica S1
S1 = "Bash"
# Declare la variable simbólica S2
S2 = "Bash"
si [$ S1 = $ S2]; luego
echo "Ambas cadenas son iguales"
demás
echo "Las cadenas NO son iguales"
fi

Código: Seleccionar todo $ ./statement.sh
Ambas cadenas son iguales

11. Comprobación de archivos

B nombre de archivo Bloquear archivo especial
-c nombre de archivo Archivo de caracteres especiales
-d nombredirectorio Verifica la existencia del directorio
-e nombre de archivo Verifica la existencia del archivo
-f nombre de archivo Verifica la existencia de un archivo regular, no un directorio
-G nombre de archivo Comprueba si el archivo existe y es propiedad de un ID de grupo efectivo.
-g nombre de archivo verdadero si el archivo existe y es un identificador de grupo establecido.
-k nombre de archivo Sticky bit
-L nombre de archivo Enlace simbólico
-O nombre de archivo Verdadero si el archivo existe y es propiedad del ID de usuario efectivo.
-r nombre de archivo Comprueba si el archivo es legible
-S nombre de archivo Comprueba si el archivo es socket
-s nombre de archivo Comprueba si el tamaño del archivo es distinto de cero
-u nombre de archivo Comprueba si el bit set-ser-id del archivo está configurado
-w nombre de archivo Comprueba si se puede escribir en el archivo
-x nombre de archivo Comprueba si el archivo es ejecutable

#! / bin / bash
archivo = "./ archivo"
if [-e $ archivo]; luego
echo "El archivo existe"
demás
echo "El archivo no existe"
fi

Código: Seleccionar todo $ ls
file.sh
$ ./file.sh
El archivo no existe
$ touch file
$ ls
archivo file.sh
$ ./file.sh
El archivo existe

Del mismo modo, para el ejemplo, podemos utilizar los bucles "while" para comprobar si el archivo no existe. Este script dormirá mientras el archivo no exista. Tenga en cuenta el negador de Bash "!" que niega (invierte) la opción -e.

12. Ciclos
12.1. En bucle

#! / bin / bash
# en bucle
para f en $ (ls / var /); hacer
echo $ f
hecho

Ejecutando un bucle for desde la línea de comando de bash:

Código: Seleccione todo $ para f en $ (ls / var /); echo $ f; hecho Código: Seleccione todo $ para f en $ (ls / var /); echo $ f; hecho
copias de seguridad
cache
choque
juegos
lib
local
cerrar con llave
Iniciar sesión
correo
optar
correr
carrete
tmp
www

12.2. Mientras bucle

#! / bin / bash
RECUENTO = 6
# bucle while
while [$ COUNT -gt 0]; hacer

deje COUNT = COUNT-1
hecho

Código: seleccione todo $ ./ while_loop.sh
El valor del recuento es: 6
El valor del recuento es: 5
El valor del recuento es: 4
El valor del recuento es: 3
El valor del recuento es: 2
El valor del recuento es: 1

12.3. Hasta bucle

#! / bin / bash
COUNT = 0
# hasta bucle
hasta [$ COUNT -gt 5]; hacer
echo El valor del recuento es: $ COUNT
deje COUNT = COUNT + 1
hecho

Código: Seleccionar todo $ ./until_loop.sh
El valor del recuento es: 0
El valor del recuento es: 1
El valor del recuento es: 2
El valor del recuento es: 3
El valor del recuento es: 4
El valor del recuento es: 5

12.4. Bucles con condiciones implícitas
En el siguiente ejemplo, la condición para un bucle while es la presencia de una entrada estándar.
El cuerpo del bucle se ejecutará siempre que haya algo para redirigir desde la salida estándar al comando de lectura.

#! / bin / bash
# Este script buscará y eliminará espacios
# en archivos, reemplazándolos con guiones bajos
DIR = "."
Controlar un bucle con un comando de lectura redirigiendo la salida en un bucle.
buscar $ DIR -type f | mientras lee el archivo; hacer
# use la clase POSIX [: space:] para buscar espacios en los nombres de archivo
if [["$ archivo" = * [[: espacio:]] *]]; luego
# reemplazar espacios con guiones bajos
mv "$ archivo" `echo $ archivo | tr '' '_' '
fi;
hecho

Código: Seleccionar todo $ ls -1
script.sh
$ touch "archivo con espacios"
$ ls -1
archivo con espacios
script.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh

13. Funciones

#! / bin / bash
# Las funciones se pueden declarar en cualquier orden
función function_B (
Función de eco B.
}
función function_A (
echo $ 1
}
función function_D (
Función de eco D.
}
función function_C (
echo $ 1
}
# Funciones de llamada
# pasar parámetro a la función función A
function_A "Función A."
function_B
# pasar el parámetro a la función función C
function_C "Función C."
function_D

Código: seleccione todo $ ./functions.sh
Función A.
Función B.
Función C.
Función D.

14. Selección de operador - Seleccionar

#! / bin / bash
PS3 = "Elige una palabra:"
# Seleccione
seleccionar palabra en "linux" "bash" "scripting" "tutorial"
hacer
echo "La palabra que ha seleccionado es: $ palabra"
# Abortar, de lo contrario el bucle será infinito.
pausa
hecho
salir 0

Código: Seleccionar todo $ ./select.sh
1) linux
2) golpe
3) secuencias de comandos
4) tutorial
Elija una palabra: 4
La palabra que ha seleccionado es: tutorial

15. Operador de elección - Caso

#! / bin / bash
echo "¿Cuál es su lenguaje de programación / scripting preferido?"
echo "1) bash"
echo "2) perl"
echo "3) phyton"
echo "4) c ++"
echo "5) ¡No lo sé!"
leer caso;
# estructura de selección de caso simple
# tenga en cuenta que en este ejemplo $ case es solo una variable
# y no tiene por qué llamarse así. Este es solo un ejemplo
caso $ caso en
1) echo "Seleccionaste bash" ;;
2) echo "Seleccionaste perl" ;;
3) echo "Seleccionaste phyton" ;;
4) echo "Seleccionaste c ++" ;;
5) salir
esac

Código: Seleccionar todo $ ./case.sh
¿Cuál es su lenguaje de programación / scripting preferido?
1) golpe
2) perl
3) fiton
4) c ++
5) ¡No lo sé!
4
Seleccionaste c ++

———————————————————————————-

Se puede obtener información más detallada de varias fuentes, por ejemplo, aquí.
original: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin ... -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296