Tema 12.docx
Document Details
Uploaded by Oganesson93
Universidad de Valladolid
Tags
Full Transcript
Tema 12. La Shell de Unix/Linux. Sintaxis de su lenguaje. Variables y operaciones. Comandos básicos para encontrar información de usuarios, crear y editar ficheros, combinar comandos y redirigir salidas. Bucles y ejecución condicionada de comandos. Redirecciones de Entrada/salida. Funciones. Ejecuci...
Tema 12. La Shell de Unix/Linux. Sintaxis de su lenguaje. Variables y operaciones. Comandos básicos para encontrar información de usuarios, crear y editar ficheros, combinar comandos y redirigir salidas. Bucles y ejecución condicionada de comandos. Redirecciones de Entrada/salida. Funciones. Ejecución inmediata, en segundo plano o mediante cron. Control del resultado de un comando. La Shell de Unix/Linux es una interfaz de línea de comandos (CLI) que permite a los usuarios interactuar con el sistema operativo mediante la introducción de comandos en un terminal. Es el intérprete de comandos que proporciona una forma de acceder a los recursos del sistema, como archivos, directorios, procesos, servicios de red y más. La Shell es un programa que se ejecuta en el sistema operativo y actúa como intermediario entre el usuario y el núcleo del sistema. Existen diferentes tipos de Shell, pero las más comunes son: - Bourne shell (sh) - C shell (csh) - TC shell (tcsh) - Korn shell (ksh) - Bourne Again SHell (bash) La Shell proporciona una serie de comandos integrados y herramientas para trabajar con archivos y directorios, manipular texto, administrar procesos y servicios, entre otras tareas. Además, es posible crear scripts para automatizar tareas y realizar operaciones más complejas. **Sintaxis de la Shell de Unix/Linux** El lenguaje de la Shell de Unix/Linux se basa en comandos y opciones que se introducen en la línea de comandos del terminal. La sintaxis general de un comando de la Shell es la siguiente: comando \[opciones\] \[argumentos\] Donde: a. comando: Es el nombre del comando que se va a ejecutar. b. opciones: Son las opciones del comando, que se utilizan para personalizar su comportamiento. Por lo general, usualmente precedidas por uno o dos guiones (-). c. argumentos: Son los datos que el comando procesa. Pueden ser nombres de archivos, rutas, cadenas de texto, números, etc. Por ejemplo, el siguiente comando de la Shell de Unix/Linux lista los archivos en el directorio actual: ls En este caso, ls es el comando y no se han especificado opciones ni argumentos. El siguiente comando utiliza una opción para mostrar los detalles de los archivos: ls -l En este caso, -l es la opción que indica que se deben mostrar los detalles de los archivos, y no se han especificado argumentos. Por último, el siguiente comando utiliza un argumento para listar los archivos de un directorio específico: ls /home/usuario/documentos En este caso, /home/usuario/documentos es el argumento que indica el directorio cuyos archivos se quieren listar. **Variables y operaciones** En Unix/Linux, las variables se utilizan para almacenar datos en la memoria y acceder a ellos cuando sea necesario. Las variables pueden tomar prácticamente cualquier nombre, sin embargo, existen algunas restricciones: - Sólo puede contener caracteres alfanuméricos y guiones bajos - El primer carácter debe ser una letra del alfabeto o "\_" (este último caso se suele reservar para casos especiales). - No pueden contener espacios. - Las mayúsculas y las minúsculas importan, "a" es distinto de "A". Asignación y recuperación de variables: - [Asignación de variables]: Para asignar el valor a una variable simplemente debemos usar el signo =. Por ejemplo, nombre=\"Juan\" creará una variable llamada \"nombre\" y le asignará el valor \"Juan\". - [Recuperación de las variables]: Para recuperar el valor de dicha variable sólo hay que anteponer el símbolo de dólar \$ antes del nombre de la variable. Existen unas variables especiales que son las variables de entorno globales. Algunas de las más comunes son: a. PATH: Se utiliza para especificar la ubicación de los comandos ejecutables en el sistema. b. HOME: Se utiliza para especificar el directorio de inicio del usuario actual. c. USER: Se utiliza para mostrar el nombre de usuario actual. d. PS1: Se utiliza para especificar el formato del prompt de la terminal. e. PWD: directorio actual Operaciones - Operaciones aritméticas: Se pueden realizar operaciones aritméticas utilizando variables numéricas. Estas operaciones se deben realizar dentro de \$(( )). Por ejemplo: a=\$((1+2)) - Operaciones de cadenas de texto: Se pueden realizar operaciones de cadenas de texto utilizando variables de texto. Algunas operaciones comunes son: a. Concatenación: nombre\_completo=\"\$nombre \$apellido\". (\*) Diferencia entre utilizar " y ' b. Longitud de la cadena: longitud=\${\#nombre} c. Extracción de una subcadena: subcadena=\${nombre:0:3} - Operaciones lógicas: El principal uso que tienen las operaciones lógicas es determinar si algo es verdadero o falso para la toma de decisiones. Para poder hacer comprobaciones, tenemos la orden test. Se puede ejecutar con el comando test seguido de la comprobación que queremos hacer, o delimitar la comprobación entre corchetes. Es decir, si quiero comprobar si \$A es igual a \$B puedo poner test \$A = \$B, pero también puedo poner \[ \$A = \$B \]. Se puede hacer comparaciones entre números, se utilizará los operadores: -eq, -ne, -ge, -gt, -le, -lt. Para comparar cadenas de caracteres: ==, ¡=, \. (-n distinta a cero). Se pueden combinar varias condicones/test usando los comando booleanos && (and), II (or), and ! (not). (\*) se utilizará comillas dobles (") cuando por ejemplo estamos haciendo referencia a archivos o directorios con blancos en su nombre (ls -l "Mis documentos"). También cuando dentro de una cadena de texto queremos incluir el contenido de una variable ("El nombre completo de Juan es \$nombre\_completo"). Cuando utilizamos comillas simples (') es para referencias a un texto literal. Aquí hay algunos **comandos básicos en Unix/Linux** para encontrar información de usuarios: - id: Este comando muestra el ID de usuario y los grupos a los que pertenece. - who: Muestra quién está actualmente conectado al sistema, incluyendo su nombre de usuario, terminal de conexión y hora de inicio. ![](media/image2.png) - w: Muestra quién está conectado actualmente al sistema, incluyendo información sobre qué están haciendo. - finger: Este comando muestra información detallada sobre un usuario específico, como su nombre completo, la última vez que inició sesión y la ubicación de su directorio de inicio. En Unix/Linux, se pueden **crear y editar ficheros** utilizando diferentes comandos de línea de comandos. Aquí hay algunos ejemplos de cómo crear un fichero: a. Crear un fichero vacío: Se puede crear un fichero vacío utilizando el comando touch. Por ejemplo, touch archivo.txt creará un fichero llamado \"archivo.txt\" en el directorio actual. b. Crear un fichero con contenido: a. Utilizando el comando echo para escribir el contenido en el fichero. b. Utilizando el comando cat: cat \> nombre\_del\_archivo.txt. Así se crea el archivo y puedes comenzar a rellenarlo con texto. Para agregar varias líneas de texto, simplemente presiona Enter al final de cada línea. Cuando hayas terminado, presiona CTRL + D** **para salir del archivo. Para editar un fichero se tienen que utilizar editores de texto: Vi o Vim (versión mejorada de Vi): Es el editor de texto clásico en UNIX. Con vi nombre\_archivo se abre el archivo en modo comando. Existen todos modos o estados de vi: - Modo comando: este es el modo en el que se encuentra el editor cada vez que se inicia. En este modo se puede ejecutar comandos sobre el contenido del fichero. - Modo edición: este es el modo que se usa para insertar el texto. Del modo edición se pasa al modo comando usando la tecla ESC. Del modo comando se pasa al modo edición con alguna de las siguientes teclas: i,I,a,A,o,O (y alguna otra). GNU Nano es otro editor de texto fácil de usar para sistemas operativos Unix y Linux que se ejecuta en la línea de comandos. En Unix/Linux, es posible **combinar varios comandos y redirigir sus salidas** para realizar tareas más complejas. Aquí hay algunos ejemplos de cómo combinar comandos y redirigir salidas en Unix/Linux: Combinar varios comandos de manera que la salida de unos sean las entradas de los siguientes: para ellos se puede utilizar el símbolo \| (pipe). Por ejemplo, ls -l \| grep \".txt\" mostrará el contenido del directorio actual en formato detallado (ls -l) y pasará la salida al comando grep para buscar los ficheros que contengan la extensión \".txt\". Si además añadimos el comando sort la ordenamos y finalmente la salida la redirigimos a un fichero: Por ejemplo, ls -l \| grep \".txt\" \| sort \> lista\_ficheros\_ordenada.txt. Si en vez de utilizar "\>" se utiliza "\>\>" la salida se añade al final del contenido del fichero. En Unix/Linux, hay varias formas de **implementar bucles y ejecución condicionada de comandos**. A continuación, se presentan algunos ejemplos de cómo hacerlo: **Bucles** 1. [WHILE:] el bucle se ejecutará mientras se cumpla una condición: i=0 while \[ \$i -lt 100 \] do echo \'Esto es un ejemplo de bucle' \$((i++)) done 2. [UNTIL]: el bucle se ejecutará hasta que se cumpla la condición: i=10 until \[ \$i -lt 0 \] do echo \$i \$((i\--)) done 3. [FOR]: permite iterar sobre una serie de elementos de una cadena, lista, rango, etc. for i in {1..1000} do echo \$i done Se puede utilizar con la salida de un comando: for i in \$(ls) do echo \$i done **Ejecución condicionada de comandos** 1[. if statement] El comando if se utiliza para ejecutar un conjunto de comandos si una determinada condición es verdadera. La sintaxis básica es: if condición then comando1 else comando2 fi Por ejemplo, para imprimir \"Hola, Juan!\" si la variable \"nombre\" es \"Juan\" y \"Hola, mundo!\" si no lo es, se puede usar: if \[ \$nombre = \"Juan\" \] then echo \"Hola, Juan!\" else echo \"Hola, mundo!\" fi 2\. [if-elif-else statement] El comando if-elif-else se utiliza para ejecutar un conjunto de comandos si la primera condición es verdadera, otro conjunto de comandos si la segunda condición es verdadera y otro conjunto de comandos si todas las condiciones son falsas. La sintaxis básica es: if condición1 then comando1 elif condición2 then comando2 else comando3 fi Por ejemplo, para imprimir \"Hola, Juan!\" si la variable \"nombre\" es \"Juan\", \"Hola, María!\" si la variable \"nombre\" es \"María\" y \"Hola, mundo!\" si no es ninguna de ellas, se puede usar: if \[ \$nombre = \"Juan\" \] then echo \"Hola, Juan!\" elif \[ \$nombre = \"María\" \] then echo \"Hola, María!\" else echo \"Hola, mundo!\" fi En Unix/Linux, las **redirecciones de entrada/salida** permiten redirigir el flujo de datos entre los comandos y los archivos o dispositivos. ![Gráfico Descripción generada automáticamente](media/image4.png) Por defecto, un proceso toma su entrada de la entrada estándar, envía su salida a la salida estándar y los mensajes de error a la salida de error estándar. A continuación, se presentan algunas de las redirecciones de entradas/salidas para cambiar estas entradas/salidas estándar: **Redirección de entrada** *1. comando \< fichero* La redirección \< se utiliza para tomar la entrada de un comando desde un fichero. Por ejemplo, para contar el número de líneas de un archivo llamado \"archivo.txt\", se puede usar: wc -l \< archivo.txt En este caso, el comando wc cuenta el número de líneas de entrada que recibe desde el archivo \"archivo.txt\". *2. comando \ lista.txt En este caso, la salida del comando ls se redirige al archivo \"lista.txt\". 2. *comando \>\> fichero* Añade la salida de comando al final del fichero. Por ejemplo, para agregar la salida del comando date al final de un archivo llamado \"registro.txt\", se puede usar: date \>\> registro.txt En este caso, la salida del comando date se agrega al final del archivo \"registro.txt\". **Redirección de errores** 1. *comando 2\> fichero* Envía la salida de error al fichero. Por ejemplo, para redirigir los mensajes de error del comando ls a un archivo llamado \"errores.txt\", se puede usar: ls /no/existe 2\> errores.txt En este caso, el comando ls intenta listar un directorio que no existe, lo que genera un mensaje de error que se redirige al archivo \"errores.txt\". Se puede redirigir la salida de error a la salida estándar: *comando 2\>&1* 2. *comando &\> fichero* La redirección &\> se utiliza para redirigir tanto la salida estándar (stdout) como los mensajes de error (stderr) a un archivo. Por ejemplo, para guardar tanto la salida del comando ls como sus mensajes de error en un archivo llamado \"resultado.txt\", se puede usar: ls /no/existe &\> resultado.txt En este caso, tanto la salida estándar como los mensajes de error del comando ls se redirigen al archivo \"resultado.txt\". En Unix/Linux, las **funciones** son bloques de código que se pueden reutilizar para realizar tareas específicas en un script de shell. Las funciones se definen utilizando la siguiente sintaxis: \# Definición de funciones\ funcion1() {\ *comandos*\ }\ funcion2() {\ *comandos*\ }\ \# Programa principal\ funcion1 p1 p2 p3 #### Paso de parámetros La función referencia los parámetros pasados por posición, es decir, \$1, \$2, \..., y \$\* para la lista completa: \$ cat funcion1.sh\ \#!/bin/bash\ funcion1()\ {\ echo \"Parámetros pasados a la función: \$\*\"\ echo \"Parámetro 1: \$1\"\ echo \"Parámetro 2: \$2\"\ }\ \# Dentro del programa principal se llama a la función\ funcion1 \"hola\" \"que tal estás\" adiós\ \$\ \$ bash funcion1.sh\ Parámetros pasados a la función: hola que tal estás adiós\ Parámetro 1: hola\ Parámetro 2: que tal estás Para llamar a una función en un script de shell, se utiliza la sintaxis: nombre\_funcion argumento1 argumento2 \... En Unix/Linux, **existen tres formas principales de ejecutar comandos: inmediata, en segundo plano o mediante cron**. **Ejecución inmediata** La ejecución inmediata se refiere a la ejecución de un comando en la línea de comandos de la terminal. Por ejemplo: ls -l /var/log Este comando se ejecuta inmediatamente en la terminal y muestra una lista de los archivos en el directorio /var/log. **Ejecución en segundo plano** La ejecución en segundo plano se refiere a la ejecución de un comando en segundo plano, lo que significa que el comando se ejecuta sin bloquear la terminal y el usuario puede seguir utilizando la terminal para otras tareas. Para ejecutar un comando en segundo plano: *comando &* Por ejemplo: sleep 60 & Este comando hace que el sistema espere 60 segundos antes de finalizar, pero la ejecución del comando se realiza en segundo plano. El comando fg te permite traer un proceso a primer plano. - *fg %número de proceso* (\*) el número del proceso se obtiene de Jobs que muestra los procesos ejecutándose en segundo plano de nuestro terminal. Así si quisieras traer el proceso 2 a primer plano, tan solo tienes que ejecutar fg %2. **Ejecución mediante cron** La ejecución mediante cron se refiere a la programación de un comando para que se ejecute en un momento específico en el futuro. Cron es un servicio del sistema que permite la programación de tareas repetitivas en el tiempo. Para programar una tarea en cron, se debe editar el archivo crontab. Cada usuario tiene su propio archivo crontab, y se puede editar con el comando \"crontab -e\" en la línea de comandos. El archivo crontab tiene una estructura específica en la que cada línea representa una tarea programada. ![Texto Descripción generada automáticamente](media/image6.png) Por ejemplo, para programar un comando para que se ejecute todos los días a las 3 am, se debe agregar la siguiente línea al archivo crontab: 0 3 \* \* \* comando\_a\_ejecutar (\*) comando puede ser un script de UNIX En esta línea, \"0 3 \* \* \*\" indica que la tarea se ejecutará todos los días a las 3 am, y \"comando\_a\_ejecutar\" es el comando que se debe ejecutar. Con crontab --l se listan los procesos en el crontab del usuario En Unix/Linux, es posible **controlar el resultado de un comando** mediante el uso de los códigos de salida (exit status). Los códigos de salida son números que indican si un comando se ejecutó correctamente (0) o no (\ 0). Para controlar el resultado de un comando en la línea de comandos, se utiliza el operador de control \"&&\" y \"\|\|\". - \"&&\" permite ejecutar un segundo comando solo si el primer comando se ejecutó correctamente - \"\|\|\" permite ejecutar un segundo comando solo si el primer comando no se ejecutó correctamente. Por ejemplo, supongamos que queremos copiar un archivo de un directorio a otro y queremos verificar si la copia se realizó correctamente antes de realizar otra tarea. Podemos utilizar el siguiente comando: cp /ruta/al/archivo /ruta/de/destino && echo \"La copia se realizó correctamente\" En este caso, el comando \"echo\" solo se ejecutará si la copia se realizó correctamente y el código de salida del comando \"cp\" es 0. Otro ejemplo podría ser la ejecución de un script que requiere de ciertas condiciones para ejecutarse correctamente. En ese caso, se puede utilizar el operador \"\|\|\" para ejecutar otro comando en caso de que el primer comando no se haya ejecutado correctamente. Por ejemplo:./mi\_script.sh \|\| echo \"Error al ejecutar el script\" En este caso, si el script no se ejecuta correctamente, se imprimirá un mensaje de error en la terminal.