Test 5
Test 5
Test 5
El script, test.sh, consta de una sola línea que imprime la cadena Hello, World! (o
«¡Hola, Mundo!» en español) en la consola.
Ejectutar un script puede hacerse, ya sea pasándolo como un argumento a tu shell o
ejecuándolo directamente:
sysadmin@localhost:~$ sh test.sh
Hello, World!
sysadmin@localhost:~$ ./test.sh
-bash: ./test.sh: Permission denied
sysadmin@localhost:~$ chmod +x ./test.sh
sysadmin@localhost:~$ ./test.sh
Hello, World!
En el ejemplo anterior, en primer lugar, el script se ejecuta como un argumento del shell. A
continuación, se ejecuta el script directamente desde el shell. Es raro tener el directorio actual
en la ruta de búsqueda binaria $PATH, por lo que el nombre viene con el prefijo ./ para
indicar que se debe ejecutar en el directorio actual.
El error Permission denied (o «Permiso denegado» en español) significa que el script no
ha sido marcado como ejecutable. Un comando chmod rápido después y el script funciona. El
comando chmod se utiliza para cambiar los permisos de un archivo, que se explica en detalle
en un capítulo posterior.
Hay varios shells con su propia sintaxis de lenguaje. Por lo tanto, los scripts más complicados
indicarán un shell determinado, especificando la ruta absoluta al intérprete como la primera
línea, con el prefijo #!, tal como lo muestra el siguiente ejemplo:
#!/bin/sh
echo “Hello, World!”
o
#!/bin/bash
echo “Hello, World!”
Los dos caracteres #! se llaman tradicionalmente el hash y el bang respectivamente, que
conduce a la forma abreviada «shebang» cuando se utilizan al principio de un script.
Por cierto, el shebang (o crunchbang) se utiliza para los scripts shell tradicionales y otros
lenguajes basados en texto como Perl, Ruby y Python. Cualquier archivo de texto marcado
como ejecutable se ejecutará bajo el intérprete especificado en la primera línea mientras se
ejecuta el script directamente. Si el script se invoca directamente como argumento a un
intérprete, como sh script o bash script, se utilizará el shell proporcionado,
independientemente de lo que está en la línea del shebang.
Ayuda sentirse cómodo utilizando un editor de texto antes de escribir los scripts shell, ya que
se necesitarás crear los archivos de texto simple. Las herramientas de oficina tradicionales
como LibreOffice, que dan salida a archivos que contienen la información de formato y otra
información, no son adecuadas para esta tarea.
#!/bin/sh
^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur P
o
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text^T To Sp
ell
El editor nano tiene algunas características que debes conocer. Simplemente escribes con tu
teclado, utiliza las flechas para moverte y el botón suprimir/retroceso para borrar texto. A lo
largo de la parte inferior de la pantalla puedes ver algunos comandos disponibles, que son
sensibles al contexto y cambian dependiendo de lo que estás haciendo. Si te encuentras
directamente en la máquina Linux, o sea no te conectas a través de la red, puedes utilizar el
ratón para mover el cursor y resaltar el texto.
Para familiarizarte con el editor, comienza a escribir un script shell sencillo dentro del
editor nano:
#!/bin/sh
^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur P
o
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text^T To Sp
ell
Ten en cuenta que la opción de la parte inferior izquierda es ^X Exit que significa
«presiona control y X para salir». Presione Ctrl con X y la parte inferior cambiará:
En este punto, puedes salir del programa sin guardar los cambios pulsando la tecla N o
guardar primero pulsando Y para guardar. El valor predeterminado es guardar el archivo con
el nombre de archivo actual. Puedes presionar la tecla Entrar para guardar y salir.
Después de guardar regresarás al shell prompt. Regresa al editor. Esta vez
pulsa Ctrl y O para guardar tu trabajo sin salir del editor. Los prompts son iguales en gran
parte, salvo que estás de nuevo en el editor.
Esta vez utiliza las teclas de la flecha para mover el cursor a la línea que contiene el texto
«The time is» (o «La hora es» en español). Presiona Control y K dos veces para cortar las
dos últimas líneas al búfer de copia. Mueve el cursor a la línea restante y
presiona Control y U una vez para pegar el búfer de copia a la posición actual. Esto hace que
el script muestre la hora actual antes de saludarte y te ahorra tener que volver a escribir las
líneas.
Otros comandos útiles que puedas necesitar son:
Comando Descripción
El Scripting Básico
Anteriormente en este capítulo tuviste tu primera experiencia de scripting y recibiste una
introducción a un script muy básico que ejecuta un comando simple. El script comenzó con la
línea shebang, que le dice al Linux que tiene que utilizar el /bin/bash (lo que es Bash) para
ejecutar un script.
Aparte de ejecutar comandos, hay 3 temas que debes conocer:
Las Variables
Las variables son una parte esencial de cualquier lenguaje de programación. A continuación
se muestra un uso muy simple de las variables:
#!/bin/bash
ANIMAL="penguin"
echo "My favorite animal is a $ANIMAL"
Después de la línea shebang está una directiva para asignar un texto a una variable. El
nombre de la variable es ANIMAL y el signo de igual asigna la cadena penguin (o «pingüino»
en español). Piensa en una variable como una caja en la que puedes almacenar cosas.
Después de ejecutar esta línea, la caja llamada ANIMAL contiene la palabra penguin.
Es importante que no haya ningún espacio entre el nombre de la variable, el signo de igual y el
elemento que se asignará a la variable. Si le pones espacio, obtendrás un error como
«command not found». No es necesario poner la variable en mayúsculas pero es una
convención útil para separar las variables de los comandos que se ejecutarán.
A continuación, el script despliega una cadena en la consola. La cadena contiene el nombre
de la variable precedido por un signo de dólar. Cuando el intérprete ve el signo de dólar
reconoce que va a sustituir el contenido de la variable, lo que se llama interpolación. La salida
del script es My favorite animal is a penguin (o «My animal favorito es un pingüino»
en español.)
Así que recuerda esto: Para asignar una variable, usa el nombre de la variable. Para acceder
al contenido de la variable, pon el prefijo del signo de dólar. ¡A continuación, vamos a mostrar
una variable a la que se asigna el contenido de otra variable!
#!/bin/bash
ANIMAL=penguin
SOMETHING=$ANIMAL
echo "My favorite animal is a $SOMETHING"
#!/bin/bash
CURRENT_DIRECTORY=`pwd`
echo "You are in $CURRENT_DIRECTORY"
Este patrón a menudo se utiliza para procesar texto. Puedes tomar el texto de una variable o
un archivo de entrada y pasarlo por otro comando como sed o awk para extraer ciertas partes
y guardar el resultado en una variable.
Es posible obtener entradas del usuario de su script y asignarlo a una variable mediante el
comando read (o «leer» en español):
#!/bin/bash
El comando read puede aceptar una cadena directo desde el teclado o como parte de la
redirección de comandos tal como aprendiste en el capítulo anterior.
Hay algunas variables especiales además de las establecidas. Puedes pasar argumentos a tu
script:
#!/bin/bash
echo "Hello $1"
Se utilizó el comando grep para buscar una cadena dentro de un archivo con el indicador -q,
que significa «silencioso» (o «quiet» en inglés). El grep, mientras se ejecuta en modo
silencioso, devuelve 0, si la cadena se encontró y 1 en el caso contrario. Esta información
puede utilizarse en un condicional para realizar una acción basada en la salida de otro
comando.
Además puedes establecer el código de salida de tu propio script con el comando exit:
#!/bin/bash
# Something bad happened!
exit 1
El ejemplo anterior muestra un comentario #. Todo lo que viene después de la etiqueta hash
se ignora, se puede utilizar para ayudar al programador a dejar notas. El comando exit
1 devuelve el código de salida 1 al invocador. Esto funciona incluso en el shell. Si ejecutas
este script desde la línea de comandos y luego introduces echo $?, verás que devolverá 1.
Por convención, un código de salida de 0 significa «todo está bien». Cualquier código de
salida mayor que 0 significa que ocurrió algún tipo de error, que es específico para el
programa. Viste que grep utiliza 1 lo que significa que la cadena no se encontró.
Condicionales
Ahora que puedes ver y definir las variables, es hora de hacer que tus propios scripts tengan
diferentes funciones basadas en pruebas, llamado branching (o «ramificación» español). La
instrucción if (o «si» en español) es el operador básico para implementar un branching.
La instrucción if se ve así:
if somecommand; then
# do this if somecommand has an exit code of 0
fi
El siguiente ejemplo ejecutará «somecommand» (en realidad, todo hasta el punto y coma) y si
el código de salida es 0, entonces se ejecutará el contenido hasta el cierre fi. Usando lo que
sabes acerca del grep, ahora puedes escribir un script que hace cosas diferentes, basadas en
la presencia de una cadena en el archivo de contraseñas:
#!/bin/bash
De los ejemplos anteriores podrías recordar que el código de salida del grep es 0 si se
encuentra la cadena. El ejemplo anterior utiliza esto en una línea para imprimir un mensaje
si root está en el archivo passwd, u otro mensaje si no es así. La diferencia aquí es que en
lugar de un fi para cerrar, el bloque if, hay un else. Esto te permite realizar una acción si la
condición es verdadera, y otra si la condición es falsa. El bloque else siempre debe cerrarse
con la palabra clave fi.
Otras tareas comunes son buscar la presencia de un archivo o directorio y comparar cadenas
y números. Podrías iniciar un archivo de registro si no existe, o comparar el número de líneas
en un archivo con la última vez que se ejecutó. El comando if es claramente de ayuda aquí,
pero ¿qué comando debes usar para hacer la comparación?
El comando test te da un acceso fácil los operadores de prueba de comparación y archivos.
Por ejemplo:
Comando Descripción
test 1 –ne 1 Más fácil, ejecutar test (probar) si hay desigualdad numérica
Mientras que la última forma es de uso más frecuente, es importante entender que el corchete
es un comando en sí que funciona de manera semejante al test excepto que requiere el
corchete cuadrado de cierre.
La instrucción if tiene una forma final que te permite hacer varias comparaciones al mismo
tiempo usando elif (abreviatura de elseif).
#!/bin/bash
#!/bin/bash
case "$1" in
hello|hi)
echo "hello yourself"
;;
goodbye)
echo "nice to have met you"
echo "I hope to see you again"
;;
*)
echo "I didn't understand that"
esac
Los Loops
Los loops (o «ciclos o bucles» en español) permiten que un código se ejecute repetidas veces.
Pueden ser útiles en numerosas situaciones, como cuando quieres ejecutar los mismos
comandos sobre cada archivo en un directorio, o repetir alguna acción 100 veces. Hay dos
loops principales en los scripts del shell: el loop for y el loop while.
Los loops for se utilizan cuando tienes una colección finita que quieres repetir, como una lista
de archivos o una lista de nombres de servidor:
#!/bin/bash
Primero, el script establece una variable que contiene una lista de nombres de servidor
separada por espacios. La instrucción for entonces cicla (realiza «loops») sobre la lista de los
servidores, cada vez que establece la variable Scon el nombre del servidor actual. La elección
de la S es arbitraria, pero ten en cuenta que la S no tiene un signo de dólar, pero en
el $SERVERS sí lo tiene, lo que muestra que se $SERVERS se extenderá a la lista de
servidores. La lista no tiene que ser una variable. Este ejemplo muestra dos formas más para
pasar una lista.
#!/bin/bash
for NAME in Sean Jon Isaac David; do
echo "Hello $NAME"
done
for S in *; do
echo "Doing something to $S"
done
El primer loop es funcionalmente el mismo que en el ejemplo anterior, excepto que la lista se
pasa directamente al loop for en lugar de usar una variable. Usar una variable ayuda a que el
script sea más claro, ya que una persona fácilmente puede realizar cambios en la variable en
lugar de ver el loop.
El segundo loop utiliza comodín * que es un file glob. El shell expande eso a todos los
archivos en el directorio actual.
El otro tipo de loop, un loop while, opera en una lista de tamaño desconocido. Su trabajo es
seguir ejecutándose y en cada iteración realizar un test para ver si se tiene que ejecutar otra
vez. Lo puedes ver como «mientras que una condición es verdadera, haz cosas».
#!/bin/bash
i=0
while [ $i -lt 10 ]; do
echo $i
i=$(( $i + 1))
done
echo "Done counting"