Contenidos
La shell de Linux
Un shell o intérprete de comandos es un programa interfaz que permite a un usuario escribir instrucciones para el sistema operativo. En el entorno Linux existen tres grandes familias de shells: sh, csh y ksh. El shell bash (Bourne Again Shell) pertenece a la familia sh
Una de las principales características de un intérprete de comandos es que puede programarse usando ficheros de texto que contienen los comandos que se interpretarán en la ejecución de los mismos
Estos ficheros de texto se denominan ficheros de mandatos o guiones (también scripts, shell scripts o guiones shell). Por tanto, un fichero de mandatos es un fichero de texto ejecutable que contiene órdenes interpretables por el shell
Caracteristicas
La primera línea del fichero indica el tipo de shell con el que se debe interpretar, en nuestro caso bash:
Cada línea del fichero contiene un comando que será ejecutado por el intérprete
Si se quieren ejecutar varios comandos en la misma línea deben ir separados por ‘;’
Para continuar un mandato en la siguiente línea debe terminar por ‘\’
El carácter ‘#’ al comienzo de una línea indica que es un comentario y por tanto el intérprete no lo ejecutará
Para visualizar texto o variables por pantalla, usaremos el comando echo
Variables
Cada shell tiene asociadas unas variables, que el usuario puede utilizar. Hay dos tipos de variables:
- Variables locales: No son heredadas por los procesos hijos del shell cuando se realiza un fork
- Variables de entorno: Son heredadas por los procesos hijos cuando se realiza un fork
Todas las variables van precedidas por ‘$’
Uso de las variables
Para definir una nueva variable o dar valor a una variable usamos el operador =
Como hemos mencionado antes, para visualizar por pantalla el valor de la variable usaremos el comando echo
Para convertir una variable local en una variable de entorno usaremos el comando export
Para eliminar una variable y su valor de memoria usaremos el comando unset
Para mostrar por pantalla todas las variables (tanto locales como de entorno), usaremos el comando set
Para mostrar sólo las variables de entorno usaremos el comando env
Podemos usar las siguientes variables de entorno predefinidas dentro de la shell
$HOME | Directorio de origen del usuario |
$PWD | Directorio de trabajo del usuario |
$PATH | Camino absoluto de los directorios de búsqueda de ejecutables. El directorio de trabajo del usuario no está incluido por defecto |
$PS1 | Prompt principal del shell |
$PS2 | Prompt secundario |
$IFS | Separador Interno de Campo. Utilizado por la orden interna read |
Argumentos
Como cualquier programa, un guión puede recibir valores mediante argumentos o parámetros, en la línea de comandos. Los argumentos recibidos se almacenan en una serie de variables que el guión puede utilizar
$1 | Primer argumento |
$2 | Segundo argumento |
$3 | Tercer argumento |
$4 | Cuarto argumento |
$5 | Quinto argumento |
$6 | Sexto argumento |
$7 | Séptimo argumento |
$8 | Octavo argumento |
$9 | Noveno argumento |
$C | Nombre del guión |
$* | Cadena que contiene todos los argumentos |
$# | Número de argumentos que ha recibido el guión |
shift | Mover todos los argumentos a la posición izquierda. Es decir, el valor $1 desaparece y es reemplazado por el $2 y así sucesivamente |
Comillas
Simples ‘ ‘
Cadena de caracteres que el shell toma literalmente
Inversas ` `
Deben encerrar un comando completo (con su nombre y sus argumentos) Se produce una ejecución en tres fases:
- Evaluación de variables
- Sustitución del comando por una cadena de caracteres que contiene la salida estándar del comando
- Ejecución del resultado
Dobles " "
Permiten la evaluación de variables y la sustitución de comandos
Comandos de control de flujo
Sentencia if
Expresión puede ser una expresión de comparación o un comando. Su valor será el que devuelva la expresión o la ejecución de un comando
Para entrar por la rama que sigue a then, expresión ha debido de devolver un 0 (verdadero) y para entrar en una rama elif o en una rama else, expresión ha debido devolver un valor distinto de 0 (falso)
Expresiones
Si queremos comparar dos valores debemos utilizar el comando test
test evalúa la expresión. Si ésta es verdadera devuelve el código 0 y si esta es falsa un código distinto de 0
Las expresiones más frecuentes son:
-r fichero | verdadera si el fichero existe y tiene permiso de lectura |
-w fichero | verdadera si el fichero existe y tiene permiso de escritura |
-x fichero | verdadera si el fichero existe y tiene permiso de ejecución |
-f fichero | verdadera si el fichero existe y es un fichero |
-d fichero | verdadera si el fichero existe y es un directorio |
-s fichero | verdadera si el fichero existe y su tamaño es mayor que 0 |
-z cadena | verdadera si el fichero existe y su tamaño es 0 |
-n cadena | verdadera si el fichero existe y su tamaño es distinto de 0 |
cadena1 == cadena2 | verdadera si cadena1 es igual que cadena2 |
cadena1 != cadena2 | verdadera si cadena1 es distinta que cadena2 |
cadena | verdadera si cadena no es la cadena nula |
n1 -eq n2 | verdadera si n1 es igual que n2 |
n1 -ne n2 | verdadera si n1 es distinto que n2 |
n1 -gt n2 | verdadera si n1 es mayor que n2 |
n1 -ge n2 | verdadera si n1 es mayor o igual que n2 |
n1 -lt n2 | verdadera si n1 es menor que n2 |
n1 -le n2 | verdadera si n1 es menor o igual que n2 |
Estas expresiones elementales se pueden combinar utilizando paréntesis y los operadores siguientes:
! | niega la expresión |
-a | equivale al operador AND |
-o | equivale al operador OR |
Sentencia case
Compara la cadena con los patrones, ejecutándose la lista_de_comandos correspondiente al primer patrón con el que concuerda, tras lo cual la ejecución de la sentencia case termina. Un patrón puede incluir cualquiera de los metacaracteres del shell
* es el patrón por defecto y se ejecuta cuando no lo ha hecho ninguno de los demás
Sentencia for
La lista de comandos se ejecuta tantas veces como elementos haya en la lista. Antes de cada iteración se asigna a variable el siguiente valor de la lista, empezando la primera iteración por el primer valor
Es muy útil si queremos recorrer todos los argumentos
Sentencia While
lista_ de_comandos se ejecuta tantas veces como sea verdadera expresión
Sentencia until
lista_de_comandos se ejecuta tantas veces como sea falsa expresión
Operador OR
Se ejecuta comando1; si éste devuelve un código de error distinto de 0 entonces se ejecuta el comando2, y el código que éste devuelve es el código devuelto por el comando completo; si el comando1 tiene éxito (código 0) entonces no se ejecuta el comando2 y toda la expresión tiene éxito
En el ejemplo anterior se comprueba si el fichero fich1 existe. Si existe, no se hace nada, en caso contrario se muestra un mensaje por el canal de error estándar
Operador AND
Se ejecuta comando1; si éste devuelve un código de error igual a 0 entonces se ejecuta el comando2
En el ejemplo se comprueba si existe un directorio llamado dir1. Si existe, se muestra el contenido, en caso contrario no se hace nada
Nota: no existe un operador que niege comandos
Comando read
lista_de_variables son variables separadas por un espacio
La ejecución del comando read lee de su entrada estándar una línea de texto que divide en palabras (es decir, cadenas separadas por espacios en blanco o tabuladores)
Asigna la primera palabra a la primera variable, la segunda a la segunda variable, así sucesivamente hasta completar la lista_de_variables
Si no se introducen suficientes palabras, a las variables sobrantes se les asignará la cadena nula
Si en la línea hay más palabras que variables entonces se asigna a la última variable una cadena formada por todas las palabras sobrantes
Ejemplo de recorrido linea a linea de un fichero
Comando exit
Todo comando devuelve un código para notificar al finalizar si su ejecución ha sido correcta o si ha aparecido algún error. Si la ejecución ha sido correcta se devuelve el código de error 0, y si ha habido algún problema se devuelve como código algún número positivo
Los ficheros de comandos devuelven al finalizar un código de error; exactamente el código de error devuelto por el último comando del fichero que se ejecuta. Para modificar esta situación por defecto, debemos utilizar el comando exit
Donde el argumento opcional n será un entero mayor o igual que 0. Si no se indica argumento equivale a exit 0
Cuando se ejecuta el comando exit, termina inmediatamente la ejecución del fichero de comandos y se devuelve como código de error el entero n