|
CONCLUSION
Introducción a los scripts de shell
Un script para el intérprete de comandos o shell es un fichero de
texto que contiene una sucesión de comandos de shell. Dicha serie de comandos puede
lanzarse de dos formas esenciales:
Con el comando:
sh <nombre_archivo>
en donde sh es la shell concreta para la que está escrito el script:
sh, csh, ksh, tcsh, bash... Directamente, dando permiso de ejecución al script, y
colocando como primera línea de dicho script:
#!/bin/sh
en donde, de nuevo, debe indicarse la shell concreta para la que se
escribió el script. Tradicionalmente los scripts se escriben para la shell sh. Así, en
lo que sigue debe entenderse siempre que se está hablando de cómo programar la sh.
Un script en ejecución es un proceso hijo del proceso de shell que lo
lanza. Por ello, hereda su entorno (variables de entorno, directorio de trabajo, ...) y
los cambios que en el efectúe no afectan al proceso padre. Por ello, dado el script:
#!/bin/sh
cd ..
Ejecutado desde la línea de comandos, no produce ningún efecto
``visible'':
se crea un proceso cuyo directorio de trabajo es el actual dicho
proceso cambia el directorio de trabajo al padre del actual el proceso muere
Pueden introducirse comentarios en un script de shell. Un comentario
comienza con un caracter # y se extiende hasta el final de la línea.
l estado devuelto por un proceso
Todo proceso Unix puede terminar su ejecución devolviendo un número
entero que se denomina estado de salida.
El estado es un número entero. Por convenio, un estado de 0 indica una
ejecución con éxito del proceso, y un estado distinto de 0 indica que se produjo algún
error.
Un script de shell puede devolver un estado de salida con exit. Con
exit 3 se devuelve un estado de salida 3, y con exit sin argumento se devuelve el estado
de salida del último comando ejecutado por el script.
Encadenamiento de comandos de shell
Puede realizarse con:
Convierte la salida estándar de un comando en la entrada estándar del
siguiente:
who | grep pepe
Ejecuta el comando de la izquierda, y si falla (termina con un estado
distinto de 0), ejecuta también el de la derecha:
cat pepe || echo Te equivocas de nombre de fichero, amigo
&&
Ejecuta el comando de la izquierda, y si tiene éxito (termina con un
estado de 0), ejecuta también el de la derecha:
cat pepe && echo Bueno, sab'ias el nombre del fichero
Variables en los scripts de shell
En los scripts de shell se manejan:
Variables de entorno, como PATH, TERM, ...
Variables predefinidas, como $1, $2, ... (ver aptdo. 6)
Variables que se definen dentro del propio script.
Para definir y/o modificar el valor de una variable se utiliza:
<variable = valor>
por ejemplo: var1=5.
Para que los procesos hijos del script ``hereden'' variables creadas en
éste, se utiliza:
export <variable>
por ejemplo: export var1.
Para utilizar el valor almacenado en una variable se utiliza:
$ <variable>
o bien:
${<variable>}
por ejemplo: echo $var1, o bien eco ${var1}. La fórmula ${var} se
utiliza cuando se desea separar el nombre de la variable de los caracteres que vengan a
continuación
Paso de parámetros a un script de shell
Dentro de un script de shell, con $1 se hace referencia al primer
argumento que se le pasa en la línea de comando, con $2 al segundo, y así hasta $9. $0
hace referencia al nombre del fichero que contiene el propio script.
$# hace referencia al número de parámetros que se especificaron en la
línea de comandos (sin contar el nombre del programa).
$@ hace referencia a todos los parámetros de la línea de comandos,
entrecomillados y separados por espacios.
Estructuras de control en los scripts de shell
En los scripts, además de colocar sucesiones de comandos, podemos
utilizar estructuras de control al estilo de los lenguajes de programación. Aquí se
presentan las dos principales. Ejecutar man sh para ver otras.
if--then--else--fi
Permite la ejecución condicional de ciertos comandos, dependiendo del
resultado de la ejecución de otros.
if <comando>
then
# ejecutar si comando termina con estado 0 (verdadero)
uno_o_mas_comandos else
# ejecutar si termina con estado NO 0 (falso)
uno_o_mas_comandos
fi
for--do--done
Permite la ejecución de bucles. La variable en la sentencia for va
tomando en cada iteración cada uno de los valores de la lista :
for variable [in lista]
do
uno_o_mas_comandos
done
Si se omite la parte [in ], la variable va tomando sucesivamente el
valor de cada uno de los parámetros que se pasaron al script en la linea de comandos.
Ejecución de procesos desde la shell
Cuando se introduce un comando en la shell, se crea un proceso hijo
para ejecutarlo. Mientras se ejecuta, el ``padre'' (la shell) duerme. Cuando el proceso
hijo termina se muere, y el padre continúa su ejecución (se puede introducir otro
comando).
La shell también puede lanzar la ejecución de procesos hijos sin
quedarse dormida esperando a su finalización. Esto se consigue terminando el comando con
&.
Así, el comando xcoral lanza la aplicación XCoral, quedando la shell
parada hasta que se cierre dicha aplicación. Sin embargo, el comando xcoral & lanza
la aplicación y deja la shell inmediatamente lista para recibir otros comandos.
Unix asigna a cada proceso en ejecución un número de proceso o PID.
La variable de shell $$ almacena el PID del proceso en ejecución (para ser utilizada en
un script).
El comando ps muestra los procesos del usuario que actualmente ejecuta
la máquina.
Sustitución de comandos
Cuando la shell encuentra un comando encerrado entre comillas inversas
(`nombre_comando`) lo ejecuta y lo sustituye en la línea de comandos
por la salida estándar de dicho comando.
Así, de hecho date escribe date en la salida estándar, mientras que
echo `date` escribe la fecha actual en la salida estándar.
|