Con script (escrito) se denomina programas que se escriben en texto claro y que son interpretados directamente, o sea, que no tienen que pasar por un proceso de traducción. En otros ambientes se llaman también archivos batch. Los lenguajes script se distinguen en el sentido, que ellos mismos solo tienen la funcionalidad de aglutinar comandos “externos”, los cuales pueden ser entonces de una complejidad arbitraria, sin que el lenguaje script mismo tenga muchos comandos. Existe un sinnúmero de lenguajes script, algunos ejemplos son Tcl, perl y la gran variedad de shell’s (interpretadores de comandos) como son zsh, csh, ksh, sh. El shell estándard del proyecto GNU y de Linux es bash e incorpora un lenguaje script muy poderoso.
Podemos ver un script como una listas de comandos que el sistema linux permite ejecutar automáticamente, en vez de tener que introducirlos manualmente. Hay tres conceptos que se asocian con los lenguajes script, o la programación shell: la creación de “macros”, o sea subsumir bajo un solo nuevo nombre de comando una seríe de commandos indivduales, la realización de tareas complejas a través de la combinación de varias tareas sencillas - divide and conquer, y la realización de tareas diferentes pero parecidas con un solo comando - parámetros.
Para crear un script se anotan los comandos individuales en secuencia en un archivo ascii, el cual se puede interpretar a continuación, utilizando el nombre del archivo como comando shell. Para esto se le necesita dar permiso de ejecución al archivo, ej. (“macro”):
Escriba en un archivo de nombre ’archivos’ la línea: “ls”, ejecute el commando: “chmod +x archivos”, y a continuación “./archivos”
El comando ’ls’ se ejecutara.
Vamos a ver este proceso más detallado:
Variables pueden ser leídos y escritos en cualquier momento. La preconfiguración de la computadora asigna un juego completo a diferentes variables tradicionalmente usados en unix. El juego de este variables permite detectar desde los programas y comandos en que estado y con que usuario etc. se encuentra el sistema en cualquier instanto. Porque definen el ambiente de ejecución las variables también se llaman “variables de ambiente” o “ambiente” (Environment variables, Environment).
El comando interno de bash ’set’ escribe en stdout todas las variables de ambiente y su valor. Para definir una variable simplemente se le asigna un valor:
Las variables solamente son válidos para su ambiente. Si se ejecuta un sub-shell ya no son “visibles”. Ej: “echo $VARIABLE” no imprime nada en stdout. Para hacer válida una variable se tiene que “exportar”; después de definir la variable se da el comando: “export nombre” con el nombre de la variable. De esta manera se pueden crear jerarquías de validéz de variables (scope). Las variables que solo los usamos temporalmente son “protegidos” de modificaciones de sub-shells.
Bash ofrece una sintaxis simplificada: “export CAJA=523” es lo mismo como: “CAJA=523; export CAJA”, sin embargo se prefiere utilizar la versión original en archivos script, para no crear incompatibilidad con ’sh’.
La vida real nos exige tomarlas. Bash incluye comandos, que nos permiten
Estos dos elementos se conocen como control de secuencias. La bifurcación se escribe de la siguiente manera:
Más especial:
El código de salida (exit status) del último comando de ’algunos comandos’ significa ’no válido’ si es 0, en todos otros casos significa ’válido’. Cada comando (inclusive los script) returna un valor numérico de salida al shell que ejecuta. En el caso más simple el shell retorna 0 si el comando se ha encontrado, otro valor en caso que no. Todos los comandos y las funciones shell describen minuciosamente como se genera su exit status, de donde se puede deducir como utilizarlos para la bifurcación. El exit status del últio comando se tiene disponible en texto mediante la variable especial $?.
La iteración se escribe de la siguiente manera:
do COMMANDS;
done
donde VAR es una variable shell creada en el acto, que se asigna en torno a cada cadena de caracteres presente en WORDS. si se omita se sustituye por $@, los parametros posicionales.
Veamos algunos ejemplos reales1, que nos pueden servir como machotes en caso de tener que resolver una tarea parecida:
Para leer archivos “HOWTO” comprimidos:
if [ ”$1” = ” ]; then
ls /usr/doc/faq/howto | less
else
gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less
fi
Remover recursivamente archivos temporales y de respaldo de diferentes aplicaciones conocidas y comprimir ciertos tipos de archivos:
Convertir nombres de archivos a menusculas:
Un script que hace lo mismo:
Remover archivos core: