CURSO DESDE 0 DE GNU/LINUX. Versión 2.
Entrega 43. Shell Script (II).
Más de nuevo, por favor.
En la entrega anterior vimos que en principio no se pueden manejar más de nueve parámetros, pero podemos superar esta limitación con 'shift', esto provoca la eliminación de '$1' y '$2' pasa a ser '$1' y así sucesivamente. La verdad, a mí me parece algo muy cutre, pero supongo que su explicación histórica tendrá.
#! /bin/bash
mi_variable="hola"
echo $mi_variable soy $0 me has dicho $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $9
shift
echo $9
De ejecución:
matados2k@imperio:~/curso$ sh ejemplo43.sh 1 2 3 4 5 6 7 8 9 10 11
hola soy ejemplo43.sh me has dicho 1 2 3 4 5 6 7 8 9
10
11
matados2k@imperio:~/curso$
Evidentemente, el uso de 'shift' es para emplearlo junto con '$#' y alguna estructura de control como un 'for', que si no sabes lo que es no te preocupes, que lo veremos.
Y algunas variables predefinidas útiles más.
'$?' nos da el valor de retorno del último comando ejecutado, si algo se ejecutó correctamente lo normal es que sea un valor '0'. Veámoslo en línea de comandos:
matados2k@imperio:~/curso$ chmod -r ejemplo43.sh
matados2k@imperio:~/curso$ cat ejemplo43.sh
cat: ejemplo43.sh: Permiso denegado
matados2k@imperio:~/curso$ echo $?
1
matados2k@imperio:~/curso$ chmod +r ejemplo43.sh
matados2k@imperio:~/curso$ echo $?
0
matados2k@imperio:~/curso$ chmod -r ejemplo43.sh
matados2k@imperio:~/curso$ sh ejemplo43.sh 1 2 3 4 5 6 7 8 9 10 11
sh: Can't open ejemplo43.sh
matados2k@imperio:~/curso$ echo $?
2
matados2k@imperio:~/curso$
Normalmente un número positivo distinto de cero nos va a indicar una ejecución correcta en la que ha ocurrido algo, y un número negativo un fallo. Esta variable nos puede resultar muy útil en un script para abortarlo o continuar ejecutando comandos dependiendo de lo bien que se ejecutó el comando anterior.
'$$' Nos da el número de proceso del shel script. Veamos un trágico ejemplo con triste final:
#! /bin/bash
echo Mi número de proceso es $$ y voy a suicidarme
kill $$
De ejecución:
matados2k@imperio:~/curso$ sh ejemplo43.sh
Mi número de proceso es 6431 y voy a suicidarme
Terminado
matados2k@imperio:~/curso$
'$!' Nos da el número de proceso del último proceso ejecutado en segundo plano. Veamos un nuevo caso de asesinato:
#! /bin/bash
echo Hola amigos vamos a ejecutar \'yes\' de forma silenciosa.
yes > /dev/null &
echo Contemos mentalmente hasta cinco
sleep 5
echo ¡Y muere$!\!
kill $!
echo Basado en muertes de comandos reales.
De ejecución:
matados2k@imperio:~/curso$ sh ejemplo43.sh
Hola amigos vamos a ejecutar 'yes' de forma silenciosa.
Contemos mentalmente hasta cinco
¡Y muere6528!
Basado en muertes de comandos reales.
matados2k@imperio:~/curso$