viernes, 12 de febrero de 2021

scripts en Bash... para torpes (III)

Ahora ya toca hablar de unas ideas fundamentales, y de unos primeros comandos también básicos. Ambos son conceptos de ‘cultura general’ para quien quiera asomarse a este mundo de Bash, y del ‘scripting’, y servirán para entender las cosas que vengan después y, por supuesto, para entender también cosas que verás muy a menudo si te enseñan un script.
No todas, claro… que esto es muy complejo, y todavía no se hasta donde podré llegar yo aquí. Pero bueno, de momento, sigamos con...
3 - Un poco de teoría: variables, redireccionamientos… y comandos-base


El uso de ‘variables’
Voy a avanzar esta idea, que más adelante comentaré con más detalle. Porque esto de ‘las variables’ es algo básico. Atención: lo de ‘variable’ no tiene nada que ver con el concepto (intuitivo) de ‘dato que no es constante’. En Programación, 'variable' solo es una entidad que se vincula a una información, o a un valor resultante de una acción para, de esta forma, ya definido, poder aportarlo, muy cómodamente, cuando tenga que usar.
Dicho ‘en cristiano’, para entenderlo mejor, la variable no es más que «una palabra (corta) que comunicamos (al sistema) que equivale a algo mucho más largo, o cambiante, o complejo… que tendremos que definir, claro». Para, de esta forma, poder utilizar el nombre corto (la variable) en vez de ‘todo el rollo’.
‘Declarar una variable’ es indicar a qué nos queremos referir con ella. Por ejemplo, usando el comando read (que enseguida veremos, adelanto que lo hace este comando es que el intérprete de comandos ‘lea’ (reciba) lo que el usuario teclea (o copia y pega) en la terminal) podemos decir...
read -p "Copia y pega la dirección web:   " WEB
donde estamos declarando que todo el rollo de 'https:\\www…' que peguemos/escribamos lo vamos a poder sustituir, en el futuro, por la simple palabra ‘WEB’ (eso si, invocada como ‘variable’)
E 'invocar una variable', cuando se quiera usar, se hace con la simple expresión (que veremos por todas partes)…
$nombre_variable
O sea, en el caso… $WEB


Los canales de comunicación
Tengamos claro un concepto más: que los procesos se comunican con el sistema por tres canales básicos fijados por el propio sistema: el canal del input (llamado STDIN, o standard input), el del output (STDOUT) y el de ERROR (STDERR). Cada uno tiene su identificador (id) para poder ser invocados por el programa que son, respectivamente, [id = 0], [id = 1] e [id = 2].
Por defecto, el canal de comunicación STDIN (entradas estandar) permite al sistema leer lo que escribes en el teclado, mientras que, también por defecto, el propio sistema utiliza la pantalla del monitor para recibir lo generado por el canal STDOUT (salidad estandar) y SRDERR (comunicación de errores). Y dicho esto...

Los operadores de redireccionado y las tuberías
Los 'operadores' son convenciones (normalmente signos tipográficos) fijadas para asignar funciones concretas. Las más típicas son las que se refieran al redireccionado, y a las tuberias.
Vamos a explicarlo: la mayor parte de los comandos permiten entradas de input por su canal STDIN, escriben su ‘salidas’ por STDOUT y envían los mensajes de error por STDERR. Esto significa que se pueden ‘encadenar órdenes, o datos’ mediante unas pipes (tuberías). Por entenderlo con un simil, redireccionar es hacer como un fontanero cuando engancha la salida del grifo de un depósito a la toma de entrada de otro depósito.
Y así, tenemos estos (muy conocidos) operadores...
El operador « > » ( y el « < ») redirige la salida de un comando a un fichero, o viceversa.
Por ejemplo, el mandato
echo "Esta es una prueba" > prueba.txt
crea el archivo ‘prueba.txt’, con ese texto (y en la ruta donde se abrió la consola).
Nota importante: este operador « > » crea un nuevo archivo, o ‘sustituye’ el contenido, si ya existiese ese archivo. Si (existiendo el archivo, y no vacío) no queremos que se sustituya, sino ‘que se añada’ (por ejemplo el nuevo resultado de un comando), el operador debe ser « >> » (doble signo ‘mayor que’). Y cuidado, al escribirlo, con la ‘corrección automática’ del LibreOffice)
Por cierto, de aquí podemos deducir que la forma más fácil de crear un archivo (vacío) de texto es redireccionando un input ‘vacío’ a un nombre de archivo, con el sencillo mandato...

> archivo.txt
Con el operador inverso, el « < » podemos hacer lo contrario: que un comando tome su entrada de un archivo. Por ejemplo, veremos en pantalla el contenido de 'archivo.txt'...
sort < archivo.txt
El operador « ; » (el punto y coma) te ordena, simplemente, que tras ejecutar A siempre hagas B (aunque A te de error). 
Se suele emplear mucho, en los scripts, para ‘ahorrar líneas’ escribiendo, tras una orden el punto y coma:
comando A ; comando B


El operador «|» indica conectar la salida (STDOUT) de un comando con la entrada (STDIN) de otro.
Es la genuina ‘tubería’. Por ejemplo, el mandato
ls /home/doc/ | grep 0-
lista los directorios y archivos de ‘mi’ /home pero solo toma (esto hace 'grep') los que contengan ‘0-’


Y los operadores lógicos « && » y « || » condicionan la ejecución de un comando en función de otro.
El primero, &&, indica que se ejecute algo ‘tras ejecutarse lo anterior’. Ya vimos este ejemplo...
sudo aptitude update && sudo aptitude safe-upgrade
Y el operador || ordena la ejecución de algo, si no se ejecuta (por fallo o error) lo anterior
comando1 || comando2
Ambos operadores son útiles para mandar ejecutar tareas consecutivas o condicionadas.


Algunos comandos típicos
Los dos comandos más utilizados puede que sean « echo » y « read ». El comando echo se usa para hacer aparecer en pantalla la instrucción (o información) que te da el sistema. Por contra, el otro (read) se usa, como ya dije, para que el sistema ‘lea’ lo que sale (o escribas) por pantalla.
O sea, 'echo' da (por pantalla) un output y 'read' toma (para procesar) un input.

el comando echo
Su sintaxis habitual es muy sencilla: escribiendo en consola
echo texto o dato
hace que aparezca en pantalla lo que viene detrás de ‘echo’ (una pregunta, un texto, el resultado de invocar a una ‘variable’…). No es estrictamente necesario, pero es bueno ponerlo entre comillas por si el intérprete de comandos debe interpretar algo.

Como ocurre con la mayoría de los comandos, « echo » admite algún ‘modificador’. Se usa, a veces, el «echo -n…» para indicar que no añada una nueva linea, y más frecuentemente el «echo -e…» que, al parecer, activa la interpretación de las cadenas ‘antibarra (‘backslash’)-caracter’ que se pueden ver en ‘man echo’ o, mejor, en ‘help echo’. Como ejemplos, \a introduce un sonido, \n introduce (si se intercala en el texto) un salto de línea, \t introduce un tabulado (sangría) horizontal, etc.
Por poner un ejemplo de cómo funciona, prueba (copia y pega) en consola
echo -e "este programa\n\t\ase llama $0"
y vete repitiéndolo, para ver cómo varía quitando /a, o /t....
Por cierto, si se pone modificador es obligatorio “entrecomillar” el texto que siga. Por cierto, una pequeña explicación (previa): la variable que se invoca, $0, es una variable especial ‘del entorno Bash’ que sirve para declarar el nombre del programa o aplicación en uso. (así que en vez de $0 verás que sale ‘Bash’)
Y acabo con un ‘divertimento’: acabo de leer que añadiendo la secuencia de escape « \e[1;XXm », donde XX es un código de colores del 30 al 37, para color de la letra, y del 40 al 47 para el color de fondo (por ejemplo 31(41) es rojo, 33(43) es amarillo, etc) coloreas la salida del comando echo. Prueba, por ejemplo...
echo -e "\e[1;33mHola Pepe, buenos días"
(OJO con las comillas, si te da error, tecléalas directamente en la consola...)
Diré, finalmente, que hay otro comando parecido al ‘echo’, que es el ‘printf’ con más ‘potencia’, pero como hace lo mismo, que quede para los estudiosos.

El comando read

Si echo ‘presenta’ un ‘output’ por pantalla, el comando read, por contra, se encarga de leer el input, es decir una línea o texto introducido por el usuario (y, normalmente, asignarle una variable).
Hombre, en los scripts ‘profesionales’ no suele ser habitual pedir al usuario que introduzca datos, pero es importante conocerlo, porque puede servir, en general, para recibir un ‘input’ a través del teclado, o copiando y pegando. Su sintaxis suele ser...
read -p “escribe el dato solicitado” nombre_variable
Comentar que se pone el modificador « -p » (prompt) para permitir presentar en pantalla (evitando asi, un ‘echo’) el texto “entrecomillado” que sigue (con el que se solicita hacer algo) y que ‘nombre_variable’, evidentemente, es el nombre que asignemos a esa variable que ‘declaramos’.
Un ejemplo sencillo para ver cómo funcionan ambos comandos (un input y un output) puede ser este:
#!/bin/bash
read -p "Escribe el nombre del fichero: " nombre
echo "El fichero a procesar es: $nombre"

(un consejo de novato, para novatos: en general, puedes evitar tener que ir creando estos pequeños scripts 'de ejemplo' copiando, en consola, las líneas (órdenes) del mismo
e irlas separando por && antes de dar al ENTER.  Así (en principio...) podrás ver el resultado en pantalla).
Read es un comando muy potente, y usa ‘modificadores’. Vamos, que un programador se lo estudiará a fondo. Para tener una ‘culturilla’, vamos a ver algunas de sus posibilidades
Una cuestión interesante es que permite usar varias variables en un mismo comando, separando los nombres de las variables con un espacio en blanco. Por ejemplo…
#!/bin/bash
read -p ″Escribe tu nombre y tus cuatro primeros apellidos: ″ NOM AP1 AP1 AP3 AP4 
echo “$NOM, tu madre se apellida $AP2 $AP4”
Para profundizar, ver, por ejemplo, aquí (o buscar con Google)
Precisamente de ahí voy a copiar unas útiles estructuras de read que se pueden usar mucho como final de un script:
read -rsp $'Pulsa ENTER para continuar...\n'
y (ésta es la interesante)...
read -rsp $'Pulsa cualquier tecla para salir...\n' -n 1 key


los comandos sleep y wait… y otros
El comando ‘sleep tiempo pausa el proceso durante el tiempo (en segundos) que se indique: sleep 10 introduce una pausa de 10 segundos.
El comando ‘wait’ suspende la ejecución del proceso actual hasta que un proceso hijo haya terminado, o hasta que se produzca una señal cuya acción es terminar el proceso actual. Se usa bastante menos. Otros comandos, como ‘break’, y ‘continue’, permiten salir inmediatamente de ciclos for, while, until o select (que más adelante analizaremos), pero vamos a dejarlo aquí, porque hay muchísimos más comandos.
Y, finalmente, no hay que olvidarse de esos ‘pequeños grandes comandos’ del idioma de programación, y de la consola, como son ls, sort, grep, find, cat... que es bueno (sobre todo si te gustan estos temas), tener memorizados (o a mano). Son muy potentes, e interesantes, pero no voy profundizar en ellos, hay muchísima información, y ejemplos de uso, ‘rastreando’ con Google.

 

Ir al Sumario (del tema)

 

 

No hay comentarios:

Publicar un comentario