Вы находитесь на странице: 1из 10

Pequeño e insignificante manual introductorio

a shell scripting
GEELF, Rapimaññ
21 de julio de 2010
Índice
1. Lo que hay que saber 3

2. ¿Que es un script? 3

3. ¿Por qué shell script? 3

4. Tu primer script 4

5. Solicitando información al usuario como argumentos 5

6. Shell???? 6

7. bash scripting 6
7.1. Lı́nea de Shebang . . . . . . . . . . . . . . . . . . . . . . . . . 6
7.2. Definiendo variables . . . . . . . . . . . . . . . . . . . . . . . . 6
7.3. Interactuando con el usuario . . . . . . . . . . . . . . . . . . . 7
7.4. Estructuras de control . . . . . . . . . . . . . . . . . . . . . . 7
7.4.1. Condicionales . . . . . . . . . . . . . . . . . . . . . . . 7
7.4.2. Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Licencia
Puedes utilizar y distribuir este manual bajo la Licencia Atribución-No
Comercial-Licenciar Igual 2.0 Chile de Creative Commons, disponible en
http://creativecommons.org/licenses/by-nc-sa/2.0/cl/legalcode. Bási-
camente, eres libre de:

copiar, distribuir y comunicar este manual

hacer obras derivadas

bajo las siguientes condiciones:

Debes reconocer y citar la obra de la siguiente forma “Este manual fue


escrito por el GEELF”

No puedes utilizar este manual para fines comerciales

2
Si alteras o transformas este manual, o generas una obra derivada, sólo
puedes distribuir la obra generada bajo una licencia idéntica a ésta

1. Lo que hay que saber


Es de asumir que si estas leyendo este manual estas familiarizado con los
comandos básicos utilizados en los entornos Unix (como GNU/Linux); si no
es ası́ te recomiendo que en lugar de leer este documento aprendas primero
algunos aspectos básicos de GNU/Linux. Como referencia, serı́a apropiado:

conocer comandos básicos, como cd, ls, rm, mkdir, rmdir, echo, pwd,
cat, grep, sort, wc, chmod...

conocer a grandes rasgos como programar(da lo mismo el lenguaje)

2. ¿Que es un script?
Un lenguaje de script o lenguaje de scripting es un lenguaje de programa-
ción que permite controlar una o mas aplicaciones de software; un script es
un archivo creado con este lenguaje. En español podrı́amos llamarlo “archivo
de órdenes” o “archivo de procesamiento por lotes”

3. ¿Por qué shell script?


Mediante el uso de un shell script puedes combinar TODOS los comandos
que se pueden ocupar “por consola”1 esto implica un ahorro importante de
tiempo. Es usual verse en situaciones en las que debes ejecutar una larga
lista de comandos y posteriormente debes ejecutar estos mismos comandos
cambiando solo algunos parámetros (por ejemplo, nombre de un archivo)En
estos casos te serı́a muy conveniente crear un script que contenga todos estos
comandos.
1
Escribo consola entre comillas porque técnicamente no es el término apropiado, aunque
está ampliamente extendido y de hecho es el que yo mismo uso

3
4. Tu primer script
Crear un script es muy sencillo, solo tienes que escribir un archivo con
los comandos que quieres utilizar, darle permisos de ejecución y eso es todo!
Como ejemplo, supongamos que necesitas crear una carpeta de nombre “ho-
la” y al interior de ésta debe ir un archivo que contenga una lista detallada
del contenido de tu carpeta de usuario, luego debes moverte a esta carpeta
y ver el contenido del archivo creado (Es algo bastante inútil, pero recuerda
que se trata solo de un ejemplo). El script quedarı́a ası́:

mkdir hola
ls -l > ./hola/lista
cd hola
cat lista

Escribe esto en un archivo de texto, para esto utiliza tu editor favorito, o


desde la consola, escribe cat > ndelscript << ALGUNACLAVE y luego ingre-
sa la lista de comandos y cuando finalices escribes “ALGUNACLAVE” (Es muy
comun usar EOF). Si utilizas este último método te quedarı́a algo ası́::

cat > ndelscript << LQS


mkdir hola
ls -l > ./hola/lista
cd hola
cat lista
LQS

Esto creará un archivo de nombre “ndelscript” con el contenido deseado.


Ahora tienes que darle permisos de ejecución a este archivo:
chmod u+x ndelscript.
Eso es todo, ejecuta tu archivo con ./ndelscript. Probablemente habrás
notado que en lugar de las últimas dos lı́neas pude haber escrito simplemente
cat ./hola/lista. Fue puesto ası́ a propósito para que te percates de una
propiedad interesante de los scripts; luego de ejecutar, revisa en qué carpeta
te encuentras (con pwd). Exacto!!! no te moviste a la carpeta “hola”, las
órdenes que utilizas en el script son independientes del trabajo que estás
realizando en la “consola”
Insisto en que este script es solo para ilustrar como es el asunto, pe-
ro técnicamente es bastante absurdo (por ejemplo, en la práctica se puede

4
mostrar por pantalla y al mismo tiempo dirigir a un archivo por medio de
tee)
¡No te desilusiones! aunque ahora quizás te parezca trivial esto de los
scripts, no lo es. Es posible introducir variables, condicionales, ciclos,etc.

5. Solicitando información al usuario como


argumentos
Muchas veces, para que tu script pueda ser utilizado necesitarás infor-
mación que conocerás sólo al momento de ejecutar. Para esto, puedes hacer
que tu script interactúe con el usuario (con usuario me refiero a quien eje-
cuta el script, que, naturalmente, puede ser el mismo autor) solicitandole la
información que necesitas.
La forma mas sencilla de interacción con el usuario es pedirle a éste que
te entregue información a modo de argumento (o parámetro) al momento de
ejecutar el script. En este caso, la información es almacenada en las variables
$1,$2,$3,... donde $1 corresponde al primer argumento, $2 al segundo y ası́.
Aclaremos esto con un ejemplo. Volvamos al script que habı́amos creado
anteriormente. Supongamos que no quieres que la carpeta que se crea se
llame siempre “hola”, ni el archivo “lista”. Podemos modificar el script para
que la carpeta y el archivo tengan el nombre que tú decidas al momento de
ejecutar; quedarı́a ası́:
mkdir $1
ls -l > ./$1/$2
cd $1
cat $2
Ası́, si ejecutamos el archivo de esta forma: ./ndelscript ncarpeta narchivo,
el nombre de la carpeta será ncarpeta y el del archivo narchivo. Evita usar
parámetros con mas de una palabra, ya que serı́an reconocidos como paráme-
tros diferentes.2
2
Si por alguna razón debes usar espacios para un parámetro, puedes hacerlo utilizando
comillas simples, ej. ’Carpeta Nueva’, sin embargo surge inmediatamente otro inconve-
niente: La mayor parte de los comandos que utilizas dentro del script tienen también esta
limitante en los parámetros (es decir, espacio implica nuevo parámetro) por lo que de-
bes agregar comillas a las variables también, es decir, debes reemplazar $1 por “$1”, $2
por “$2”, etc. Aún cuando es posible, es una buena práctica no usar espacios o sı́mbolos
extraños en los nombres de archivos o parámetros, evitarás muchos inconvenientes

5
6. Shell????
Por shell no nos referimos a la ventanita negra que abrimos para ejecutar
nuestros comandos, sino al programa que interpreta nuestros comandos y los
introduce al kernel. En UNIX (y por lo tanto en GNU/Linux) existen tres
grupos de shells, las basadas en bourne shell (sh), las basadas en C shell
(csh) y las rarezas que no estan basadas en ninguna de las ateriores. Las
shells mas utilizadas son dos, tcsh (TENEX C SHELL), basada en C shell y
bash (Boure Again Shell) basada en Bourne shell.
Para continuar avanzando hay que tener en cuenta la shell que queremos
utilizar; hasta aquı́ daba lo mismo. Pero en adelante hay diferencias sintácti-
cas entre ambas shells (Digo ambas porque solo describiré como hacer scripts
en tcsh y bash). La elección de una shell es básicamente una cuestión de gus-
tos (Quizás hayan diferencias técnicas, pero eso a nosotros - simples mortales
- nos da lo mismo). Personalmente prefiero bash.
En las siguientes secciones explicaré como hacer scripts un poco mas
elaborados en bash y luego como hacer lo mismo en tcsh. Una última cosa:
Dentro de un script puedes comentar utilizando el sı́mbolo #

7. bash scripting
7.1. Lı́nea de Shebang
Se llama lı́nea de shebang a la primera lı́nea de un script (sea de shell o
de otro programa), comienza con los signos #! (conocidos como SheBang),
luego de estos signos viene la ruta completa del intérprete de comandos que
utilizará el script. En palabras simples, si queremos hacer un script en bash,
resulta conveniente escribir en la primera lı́nea:
#!/bin/bash
Si un script no lleva la lı́nea de Shebang, el sistema utilizará el intérprete
que estés utilizando en la lı́nea de comandos. (Por lo que la ventaja que te
otorga la lı́nea de Shebang es justamente poder ejecutar un script con un
interprete - en este caso, una shell - distinto al que estas utilizando)

7.2. Definiendo variables


Para definir una variable en bash basta con un signo =; para llamarla
luego de asignada, lo haremos con $ seguido del nombre. Por ejemplo:

6
saludo="Hola!!!!!!!!"
echo $saludo

Las variables utilizadas dentro de un script no son recordadas en la “conso-


la”. Al revés esto se transforma en una verdad a medias: Si desde la consola
definimos valor=“algo” y luego dentro de un script ponemos echo $valor,
obtendremos sólo una lı́nea vacı́a, pero esta variable se puede exportar pa-
ra que pueda ser utilizada por cualquier script, para esto, simplemente la
definimos ası́: export valor=“algo”.3 Te habrás dado cuenta que no debes
definir variables cuyo nombre sea un número, ya que están reservadas para
leer parámetros.

7.3. Interactuando con el usuario


Además de solicitar información al usuario en forma de parámetros, pode-
mos preguntarle directamente, para esto simplemente escribimos read valor
y lo que sea escrito por el usuario será guardado en la variable “valor”; na-
turalmente, tendremos que utilizar “echo” para imprimir por pantalla cuál
es la información que necesitamos. Volvamos al eterno ejemplo anterior:

#!/bin/bash
echo "Nombre de la carpeta: "
read carpeta
echo "Nombre del archivo: "
read archivo
mkdir $carpeta
ls -l > ./$carpeta/$archivo
cd $carpeta
cat $archivo

7.4. Estructuras de control


7.4.1. Condicionales
A continuación la sintaxis del infaltable if:

if [ condicion ]; then
comandos
3
Esto es algo que debes tener muy presente cuando configures e instales programas

7
elif [ condicion ]; then
comandos
else
comandos
fi

Para quienes conocen el comando test, la expresión [ condicion ] es equi-


valente a test condicion; elif y else son opcionales, elif es equivalente a else if
(nos ahorra espacio). Fı́jense en que se comienza con if y se termina con fi,
una notación bastante simpática. Algunos operadores que pueden utilizarse
en las condiciones son:
-gt Mayor que
-lt Menor que
-eq Igual (Si comparamos números)
-ne Distinto (Si comparamos números)
= Igual (Si comparamos cadenas de caracteres)
!= Distinto (Si comparamos cadenas de caracteres)
-a Y lógico
-o O lógico

La lista completa pueden encontrarla en el manual de test (man test). Son


particularmente interesantes los operadores que trabajan con archivos.
Volvamos a nuestro ejemplo: Supongamos que queremos agregar alguna
ayuda a nuestro script de la sección 5, una forma de hacer esto serı́a (He
supuesto que el script se llama “absurdo”):

#!/bin/bash
if [ "$1" = "--ayuda" ]; then
echo "Sintaxis: ./absurdo arg1 arg2
Este script crea una carpeta con el nombre dado en arg1 y
dentro de esta un archivo con el nombre dado en arg2 que
muestra la salida de ls en el directorio de ejecucion"
exit
elif [ "$2" = "" ]; then
echo "Faltan parametros! ingrese ./absurdo --ayuda para obtener ayuda"
exit
else
mkdir $1

8
ls -l > ./$1/$2
cat $1/$2
fi

Algunas notas:

Observen que ahora al ejecutar el script sin argumentos, o con uno solo,
el mismo script nos alertará.

En lugar de “; then” se puede anotar “then” solo, en la linea de abajo


sin “;”.

Dado que estamos comparando cadenas de caracteres se hace necesario


escribir las llamadas a los parámetros ($1 y $2) entre comillas, ya que
de otra forma no se podrı́an cubrir los casos en los que los parametros
no son dados al ejecutar.4

Si leyeron la página man de test, se habrán dado cuenta que es posible


utilizar -z "$2" en lugar de "$2" = ""

Aparte de if existe otra estructura para condicionar, se llama case y su


estructura es:

case $VARIABLE in
patron1 )
comandos1
;;
patron2 )
comandos2
;;
esac

La idea es que si la variable coincide con el o los patrones dados, se ejecu-


tan los comandos respectivos Por ejemplo (Es una broma, esto no daña su
equipo):
4
Para aclarar esto un poco mas, supongamos que ejecutamos simplemente ./absurdo
y que $1 y $2 no estan entre comillas; en este caso tanto $1 como $2 tienen valor nulo
(Ni cero ni string vacı́o, sino simplemente nulo), entonces al intentar comparar con un
string obtendremos un error, en cambio si encerramos estas variables entre comillas, las
transformaremos en un string vacı́o.

9
#!/bin/bash
echo "Quiere que destruya su disco???(S/N)"
read var
case "$var" in
’S’ )
echo "OK, sus deseos son ordenes"
echo " ###############################"
echo "Ejecutando rm -rf /* ..." ; sleep 1
echo "Borrado /etc" ; sleep 1
echo "Borrado /usr" ; sleep 1
echo "Borrado /bin" ; sleep 1
echo "Disco vacio!!" ; sleep 1
echo "BAZINGA!"
;;
’N’ )
echo "Me da lo mismo, lo mato igual"
echo "###############################"
echo "Friendo disco duro..." ; sleep 1
echo . ; sleep 1 ; echo . ; sleep 1
echo . ; sleep 1
echo "BAZINGA!"
;;
esac

7.4.2. Ciclos

10