====== 12. Scripts básicos en Linux ====== ===== VI ===== * [[https://www.atareao.es/tutorial/vim/|VIM, Un editor atemporal]] * [[https://www.atareao.es/tutorial/vim/moverte-en-vim/|Moverte en Vim]] * [[https://www.atareao.es/tutorial/vim/manipular-y-editar-con-vim/|Manipular y editar con Vim]] * [[https://www.atareao.es/tutorial/vim/el-lenguaje-de-vim/|El lenguaje de Vim]] * [[https://www.atareao.es/tutorial/vim/la-linea-de-comandos-en-vim/|La línea de comandos en Vim]] * [[https://www.atareao.es/tutorial/vim/buscar-y-reemplazar-en-vim/|Buscar y reemplazar en VIM]] * [[https://www.atareao.es/tutorial/vim/el-modo-visual-de-vim/|El modo visual de Vim]] * {{:clase:daw:si:2eval:vi.pdf |Manual de VI}} {{:clase:daw:si:2eval:chiste-vim29.png?600|}} {{:clase:daw:si:2eval:bash-montar-en-bici.png?direct&600|}} ===== Introducción a los Scripts ===== Para crear un Script en Linux hay que seguir los siguientes pasos: * Crear el fichero del Script con la extensión ".sh" vi miscript.sh * Añadir en la primera línea del fichero lo siguiente (([[https://stackoverflow.com/questions/21612980/why-is-usr-bin-env-bash-superior-to-bin-bash/21613039|Why is #!/usr/bin/env bash superior to #!/bin/bash?]])): #!/usr/bin/env bash o #!/bin/bash * Darle permisos de ejecución: chmod u+x miscript.sh * Ejecutar el Script con la ruta del directorio actual: ./miscript.sh ===== Parámetros y Variables ===== * [[http://how-to.wikia.com/wiki/How_to_read_command_line_arguments_in_a_bash_script|How to read command line arguments in a bash script]] * [[https://www.atareao.es/tutorial/scripts-en-bash/variables-en-bash/|Variables en Bash]] * [[https://victorroblesweb.es/2016/08/27/parametros-en-shell-script/|Parámetros en Shell Script]] * [[http://www.linux-es.org/node/147|Bash (III) - Variables y funciones]] * Principales variables del bash * ''$HOME'': Directorio inicial del usuario * ''$PATH'': Lista de directorios donde buscar un ejecutable * ''$PWD'': El directorio de trabajo actual * ''$UID'' : Identificador del usuario actual * ''$$'' : El PID del proceso actual * ''$1'', ''$2'' , ''$3'', ...: Cada uno de los argumentos * ''$#'': El Nº de argumentos ===== Redirecciones ===== En Linux se permite hacer la redirección de la entrada y la salida a un fichero y desde un fichero. * Redireccionar la salida find / -name "*.mkv" > mis-peliculas.txt * Añadir a la salida find / -name "*.avi" >> mis-peliculas.txt * Redireccionar la entrada sort < mis-peliculas.txt Mas información: * [[https://www.sololinux.es/guardar-la-salida-de-un-comando-en-un-archivo|Guardar la salida de un comando en un archivo]] ===== Operador Substitución ===== * [[http://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/|Bash: Assign Output of Shell Command To Variable]] * [[http://bash.cyberciti.biz/guide/Command_substitution|Command substitution]] ANYO_ACTUAL=$(date +%Y) echo $ANYO_ACTUAL ===== Operador matemático ===== Para hacer operaciones matemáticas con bash usar ''$[ ]'' a=3 b=1 c=$[ $a - $b ] echo $c Mostrará por pantalla 2 También se puede usar la orden ''bc'' que permite decimales. a=3.7 b=1.2 c=$( echo "$a - $b" | bc -l) echo $c Mostrará por pantalla 2.5 Otro ejemplo de ''bc'' echo "1.3+2.6+7.8+8.9" | bc -l Mostrará por pantalla 20.6 ===== Condicional ===== * [[http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html|6. Conditionals]] * [[http://es.wikibooks.org/wiki/El_Manual_de_BASH_Scripting_B%C3%A1sico_para_Principiantes/El_b%C3%A1sico_%28If-Then%29|El Manual de BASH Scripting Básico para Principiantes/El básico (If-Then)]] * [[https://www.tldp.org/LDP/abs/html/comparison-ops.html|Operadores de comparación en Bash]] if [ "$SALUDO" == "HOLA" ]; then echo "Ha saludado con Hola" else echo "No ha saludado con Hola" fi if [ "$SALUDO" == "HOLA" ]; then echo "Ha saludado con Hola" elif [ "$SALUDO" == "Hello" ]; then echo "Ha saludado con Hello" else echo "No ha saludado con Hola" fi if [ "$SALUDO" == "HOLA" ] || [ "$SALUDO" == "Hello" ]; then echo "Ha saludado " else echo "No ha saludado" fi if [ "$SALUDO" == "HOLA" ] && [ "$NOMBRE" == "Lorenzo" ]; then echo "Hola Lorenzo " fi if [ "$ANYO_ACTUAL" -le "2020" ]; then echo "El año actual es menor o igual que 2020" fi ^ Operadores para textos ^^^ ^ Operador en Bash ^ Significado ^ Ejemplo ^ | == | = | ''if [ "$a" == "$b" ]; then'' | | != | ≠ | ''if [ "$a" != "$b" ]; then'' | ^ Operadores para números enteros ^^^ ^ Operador en Bash ^ Significado ^ Ejemplo ^ | -eq | = (**eq**ual) | ''if [ "$a" -eq "$b" ]; then'' | | -ne | ≠ (**n**ot **e**qual) | ''if [ "$a" -ne "$b" ]; then'' | | -gt | > (**g**reater **t**han) | ''if [ "$a" -gt "$b" ]; then'' | | -ge | ≥ (**g**reater or **e**qual) | ''if [ "$a" -ge "$b" ]; then'' | | -lt | < (**l**ess **t**han) | ''if [ "$a" -lt "$b" ]; then'' | | -le | ≤ (**l**ess or **e**qual) | ''if [ "$a" -le "$b" ]; then'' | ^ Operadores lógicos ^^^ ^ Operador en Bash ^ Significado ^ Ejemplo ^ | || | O lógico | ''if [ "$a" == "$b" ] || [ "$a" == "$c" ]; then'' | | && | Y lógico | ''if [ "$a" != "$b" ] && [ "$a" != "$c" ]; then'' | ===== Bucles ===== * [[https://www.cyberciti.biz/faq/bash-for-loop/|Bash For Loop Examples]] #Muestra los números del 0 al 9 for I in 0 1 2 3 4 5 6 7 8 9 do echo Es valor de I=$I done #Borra todos los ficheros del directorio for FICHERO in $(ls) do rm $FICHERO done ===== Ejercicios ===== ==== Ejercicio 1 ==== Haz un Script que muestre por pantalla "Hola Mundo" , para ello usa la orden "echo". ==== Ejercicio 2 ==== Parámetros básicos: * Crea un Script llamado "ejer1.sh" y haz que se le pase un parámetro y que lo muestre por pantalla. * Crea un Script llamado "ejer2.sh" y haz que se le pasen 2 parámetros y que se muestren por pantalla. ==== Ejercicio 3 ==== Haz un Script llamado "sumar.sh" que sume dos números enteros que se pasan como argumentos. Modifica el Script para que acepte números decimales ==== Ejercicio 4 ==== Haz un Script llamado "nota_media_sistemas.sh" que dados 3 notas **enteras** (Examen, Prácticas y Actitud) , obtenga la nota media del módulo de "Sistemas Informáticos". Sabiendo que el peso de cada nota es del 60%, 30% y 10% respectivamente Modifica el Script de la siguiente forma: * Si la nota del examen es un 10 que muestre por pantalla "Felicidades!!" * Si alguna de las notas es menor que 0 o mayor que 10 que muestre un aviso de que esa nota no tiene un valor válido y no haga nada mas. ==== Ejercicio 5 ==== Haz un script llamado "format.sh" que le pasemos como argumentos: * El nombre de una partición * El nombre de un sistema de archivos. Solo se permitirán los siguientes sistemas de archivos: * ext4 * XFS * Btrfs Y deberá hacer: * Si no pasan los 2 argumentos deberá darse un error. * Si el sistema de archivos es "ext3" deberá indicarse que "El sistema de archivos es demasiado viejo" y no hacer nada mas * Si el sistema de archivos es "ext2" deberá indicarse que "El sistema de archivos no soporta Journaling" y no hacer nada mas * Si están los dos argumentos se deberá crear un sistema de archivos en la partición del tipo indicado. ==== Ejercicio 6 ==== Haz un script llamado "permitir_ejecucion.sh" que acepte como argumento el nombre de un fichero. La orden añadirá el permiso de ejecución al propietario de ese fichero Modifica el Script para que acepte un segundo argumento que sea alguno de los siguientes valores: * "PROPIETARIO": Añadirá el permiso solo al propietario * "GRUPO": Añadirá el permiso solo al grupo * "TODOS": Añadirá el permiso al propietario , al grupo y a otros. Con cualquier otro valor deberá mostrar un mensaje de error y no hacer nada.