# Tema 4 - SHELL SCRIPT ## 1. ¿Que es shell script? Es un archivo de texto que puede crearse con cualquier editor de texto. Contiene un conjunto de comandos que se ejecutan de forma secuencial (linea a linea). El shell actua a la vez como interprete de comandos y lenguaje de programacion, lo que permite automatizar tareas **Toma de contacto**: - **Shebang (!#)**: La primera linea de cualquier script definde el interprete de comandos a usar, comunmente ````!#/bin/bash````. - **Comandos**: Un ejemplo basico es ````echo````, que muestra texto en pantalla. **Ejemplo:** [Hola_mundo](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#hola-mundo) ## 2. Conceptos basicos: Variables y parametros ### 2.1 Variables Son espacios de memoria que almacenan cadenas de caracteres, no necesitan ser declaradas ni tienen un tipo definido. - **Creacion:** Se asignan con la sintaxis ````nombre_variable=valor````, sin espacios antes o despues del ````=```` - **Lectura:** Para leer o usar el contenido de una variable se usa el simbolo **$**, ejemplo (````echo $Nombre````) - Hay varios **tipos**, como: - **Locales**: Se usan solo en el script en el que se crearon - **De entorno**: Pueden ser utilizadas por todos los shell **Ejemplo:** [Variables](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#variables) ### 2.2 Paso de parametros Los scripts pueden recibir parametros desde la linea de comandos, se accede a ellos con variables especiales: - ````$0````: Nombre del script o programa - ````$1````, ````$2````, ````$3````...: Primer, segundo, tercer parametro, etc.. - ````$#````: Indica el numero de parametros recibidos - ````$*````: Muestra todos los parametros como una sola cadena - ````$?````: Devuelve el codigo de salida del ultimo comando ejecutado. Si tuvo existo es **0**. **Ejemplo:** [Parametros](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#paso-de-parametros) **Otras expansiones:** - **Ejecucion de comandos**: Se puede asignar el resultado de un comando a una variable. ````variable=$(comando)````. - **Aritmetica**: Se pueden realizar operaciones aritmeticas usando ````$(($numero+3))````. **Ejemplo:** [Expansiones](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#expansiones) ## 3. Entrada y salida de datos (E/S) ### 3.1 Comandos de consola - ````echo````: Escribe en pantalla, ````echo -n```` evita el salto de linea. - ````read````: Lee la entrada del usuario y la almacena en una variable. ### 3.2 Redireccion de E/S - ````comando > archivo````: Redirige la salida estandar a un archivo - ````comando < archivo````: Usa el contenido de un archivo como entrada ### 3.3 Tuberias y filtros - ````comando1 | comando2````: El resultado (salida) de *comando1* se utiliza como entrada de *comando2*. - ````grep````: Muestra lineas que coinciden con un patron - ````head```` y ````tail````: Muestra las primeras o ultimas *n* lineas de un fichero - ````cut````: Extrae columnas especificas de datos - ````sort````: Ordena las lineas de salida ## 4. Operaciones y estructuras de control ### 4.1 Operaciones - ````expr````: Se usa para realizar operaciones aritmeticas simples y manipulacion de cadenas (la multiplicacion requiere escapar el asterisco ````\*````). - ````test````: Evalua expresiones y devuelve verdadero *0* o falso *1*. - **Comparadores numericos**: ````-eq```` **igual**, ````-ne```` **diferente**, ````-gt```` **mayor**, ````-ge```` **mayor o igual**, ````-lt```` **menor**, ````-le```` **menor o igual** - **Comparadores de cadena**: ````=```` **igual**, ````!=```` **diferente**, `` **Ejemplo:** [Operaciones](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#operaciones-expr-y-test) ### 4.2 Estructuras de control - ````if```` **(Condicion simple)**: Ejecuta un bloque de codigo si se cumple una condicion. - **Sintaxis**: ````if [ expresion ]; then ... fi```` - Se puede ampliar con ````else````(si no) y ````elif````(si no si). - Se pueden anidar condiciones con ````&&```` (AND) y ````||```` (OR). - ````case```` **(Condiciones multiples)**: Idela para menus, compara una variable con multiples valores. - **Sintaxis**: ````case $VARIABLE in .... esac```` - Cada opcion termina con **;;**. - La opcion por defecto si no coincide nada es ````*)````. ## 5. Bucles - ````for ````: Se usa cuando se sabe el numero de veces que se ejecutara un codigo. - **Sintaxis de lista**: ````for VARIABLE in lista_elementos; do ... done```` - **Sintaxis C**: ````for ((inicio; final; avance)); do .... done```` - ````while````: Repite un bloque de codigo mientras se cumpla una condicion. - **Sintaxis**: ````while [ expresion ]; do ... done```` - ````until````: Repite un bloque de codigo mientras no se cumpla una condicion. - **Sintaxis**: ````until [ expresion ]; do ... done```` - ````select````: Presenta un menu al usuario para que escoja una opcion y repite el bucle. Se suele usar ````break```` para salir. **Ejemplo:** [Estructuras de control](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#estructuras-de-control) ## 6. Funciones Una funcion es un bloque de codigo reutilizable, se define al principio del script. - **Sintaxis**: `````nombre_funcion () { .... } ````` o ````function nombre_funcion { ... }```` - **Llamada**: se invocan escribiendo su nombre ````nombre_funcion````. - **Variables**: Por defecto las variables son globales. Se pueden declarar variables locales con ````local nombre_variable````. - **Parametros**: Pueden recibir parametros (````$1,$2,$3````). - **Retorno**: Pueden devolver un valor entero usando ````return valor````. El valor devuelto se recoge en la variable ````$?````. **Ejemplo:** [Funciones](https://apuntesasir.readthedocs.io/es/latest/administracion-de-sistemas-operativos/ejemplos_sh.html#funciones) ## 7. Otros elementos y comandos - **Comentarios**: Las lineas que empiezan por **#** son comentarios y no ejecutan. ### 7.1 Separadores de comandos: - ````;````: Separa una misma linea, se ejecutan de manera independiente. - ````&&````(AND): El comando2 solo se ejecuta si el comando1 tuvo exito. - ````||````(OR): El comando2 solo se ejecuta si el comando1 no tuvo exito. ### 7.2 Control de bucles: - ````break````: Termina la ejecucion de un bucle. - ````continue````: Detiene la ejecucion actual y pasa a la siguiente. - ````exit````: Detiene la ejeccion de todo el script.