La shell de Linux

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:

  1. Evaluación de variables
  2. Sustitución del comando por una cadena de caracteres que contiene la salida estándar del comando
  3. 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