You are on page 1of 12

Programación shell script

Introducción
Con el fin de proveer una interface consistente y facil para que el usuario interactuara con el 
sistema Unix/Linux (el kernel) se desarollo el shell. 
El shell es simplemente un programa que lee los comandos que se teclean y los convierte en 
una forma mas entendible para el sistema Unix/Linux. Tambien incluye algunas sentencias 
basicas de programacion que permiten: tomar desiciones, realizar bucles y almacenar 
valores en variables. 
Un script es como se llama a un archivo (o conjunto de archivos) que contiene instrucciones (en 
nuestro caso comandos de bash), y que necesita de un programa ayudante para ejecutarse (en nue­ 
stro caso la propia terminal bash será el programa ayudante). Un script tiene cierta similitud con un 
programa, pero existen diferencias. Generalmente, los programas están en lenguaje de máquina (la 
máquina lo entiende directamente), mientras que los scripts son archivos que contienen en formato 
texto los comandos o instrucciones que la aplicación ayudante ejecutará. 

Básico
Para hacer un script se puede escribir comandos de la consola de comandos. Por ejemplo, hacer un 
scritp que muestre el contenido del directorio donde estamos:
1. abrimos un fichero de texto
2. escribimos la sentencia correpondiente para listar el contenido del fichero donde estamos
3. guardamos el fichero y le damos permisos de ejecución
4. para ejecutar el programa vamos a la consola de comandos y escribimos la ruta (absoluta o 
relativa) donde está el fichero y el nombre del fichero (si el fichero está en el directorio 
donde nos encontramos escribimos ./nombrefichero)
Ejercicios:
1. La instrucción echo imprime lo que escribas a continuación, haz un script que al ejecutarlo 
escriba “hola que tal”
2. Usando indirección ( > o >> ) haz un script que al ejecutarlo agregue las siguientes líneas al 
fichero /etc/resolv.conf:
nameserver 80.58.0.33
nameserver 80.58.32.97
3. Haz un script que al ejecutarlo configure tu tarjeta de red. El comando para configurar tu 
tarjeta de red es ifconfig
4. Haz un script que al ejecutarlo te agregue la puerta de enlace 172.16.0.1 a tu tabla de rutas. 
El comando para ver/agregar rutas es route
Usos comunes
Al principio del fichero escribimos lo siguiente
#!/bin/bash
bash, en el directorio /bin, es el ejecutable que interpreta los scripts. Para saber dónde está un 
ejecutable podemos escribir en la consola de comandos
$ which ejecutable
Aunque no es necesario escribir una extensión para nuestros scripts, se suelen escribir con extensión 
.sh 

Variables
Un script puede actuar con valores externos. Vamos a ver dos formas de darle valores externos a un 
script para que actúe con ellos. La primera como arguementos y la segunda como variables que le 
pasamos ya comenzado el script (al estilo de scanf en C).

Argumentos
Pasarle argumentos a un script es lo mismo que pasarle el nombre del o de los directorios que 
queremos crear a mkdir: escribimos el nombre del comando (del script para nuestro caso) y 
separados por espacios en blanco los argumentos
Los arguementos son variables cuyo nombre viene especificado por el lenguaje script:
$0 => argumento/parámetro 0, nombre del programa
$1 => primer parámetro
$2 => segundo parámetro

$9 => noveno parámetro

Ejemplo:
Haz un programa shell que sea así y llámalo ejecutable.sh

#!/bin/bash

chmod +x $1

Lo que hace es dar permisos de ejecución al primer argumento que recibe. La forma de ejecutarlo 
sería ir a la consola de comandos y escribir

$./ejecutable.sh fichero

Y lo que haría sería dar permisos de ejecución al fichero que escribieras
Otro ejemplo:
Copia lo siguiente en un fichero de nombre parametros.sh y dale permisos (usa el script anterior).
#!/bin/bash

echo el primer parámetro es $1


echo el segundo parámetro es $2
echo el tercer parámetro es $3
echo el cuarto parámetro es $4
echo el quinto parámetro es $5

Ejecútalo de la siguiente manera

$./parametros.sh hola uno siete 4324 fichero

y con otros valores para los parámetros

El lenguaje provee de dos variables especiales
$# => guarda el número de argumentos 
que recibe el programa
$* => guarda la cadena de argumentos
(excluyendo $0)
Modifica el programa anterior y agrega 
echo se introdujeron $# argumentos
echo los argumentos introducidos son $*

Ejercicios
1. Modifica el programa 4 anterior para que en lugar que la puerta de enlace sea siempre 
172.16.0.1, se introduzca como parámetro.
2. Haz un script que reciba un directorio como parámetro y ejecute la instrucción ls ­ld sobre 
ese directorio.
3. Escribe un programa que reciba como escriba un mensaje saludando al nombre que recibió 
como parámetro.
4. Haz un script que reciba dos parámetros y cree un directorio con el nombre del primer 
parámetro y dentro de este directorio un subdirectorio con el nombre del segundo parámetro.
5. Escribe un script que reciba tres parámetros y cree un directorio con el nombre del primer 
parámetro, dentro un fichero con el nombre del segundo parámetro y escriba el tercer 
parámetro dentro del fichero.

Lectura de variables
Se usa la orden read para leer información escrita en el terminal de forma interactiva. Si hay más 
variables en la orden read que palabras escritas, las variables que sobran por la derecha se asignan 
a NULL. Las operaciones con NULL dan como resultado NULL. Si se introducen más palabras que 
variables haya, todos los datos que sobran por la drecha se asignan a la última variable de la lista.
La sintaxis es

read variable(s)

No es necesario declarar las variables ni asignarlas tipo de datos
Variables
El nombre de una variable sólo puede empezar por letras o guión bajo, y después sólo pueden 
aparecer letras, números y guión bajo.
Se puede asignar prácticamente cualquier valor a las variables
FRUTA=manzana
FRUTA=kiwi
Total=358
No hay que declarar el tipo de variable (caracter o numerica) pero hay que tener cuidado al 
utilizar valores que contienen espacios, por ejemplo: 
FRUTA=manzana naranja pera
Generara el siguiente error: 
FRUTA=manzana naranja pera
bash: naranja: command not found
Para poder utilizar espacios en los valores de las variables, se requiere que el valor se 
encierre entre comillas ("). 
FRUTA="manzana naranja pera"

Accediendo al valor de las variables
Para obtener el valor almacenado en una variable se incluye el signo $ antes de l nombre de la 
variable, por ejemplo: 

#!/bin/bash

total=385
echo $total

FRUTA=pera
echo $FRUTA

Hay que tomar en cuenta que si no se utiliza el signo $ antes del nombre de la variable, únicamente 
se despliega el nombre de la variable, por ejemplo: 

#!/bin/bash

FRUTA=aguacate
echo FRUTA

El signo $ es unicamente utilizado para acceder a el valor de las variables, pero no para definirlo, 
por ejemplo, la siguiente asignación: 
$FRUTA=manzana
Generara el siguiente error 
bash: $: command not found
Se puede tambien asingar el valor de otras variables a una variable por ejemplo: 

#!/bin/bash

X=hola

Y="$X como estas"

$ echo $Y

Fíjate que entre la variable, el operador de asignación (=) y el valor que se asigna a la 
variable, NO HAY ESPACIOS EN BLANCO.
Nota: se puede escapar el caracter $ con el backshash (\) 

#!/bin/bash

echo escribe una palabra


read X

echo al valor de X se accede escribiendo \$X: $X

Para la instrucción echo se pueden usar comillas o no, la diferencia está en lo sigueinte

#!/bin/bash

echo hola que tal


echo “hola que tal”

comprúebalo.
1. Haz un prograszama que pida el nombre y luego escriba un mensaje en el que se salude a la 
persona por su nombre

Operaciones
Hay varias formas de hacer operaciones.

expr
La sintaxis es
expr operando1 operador operando2 [operador operando3...]
Para asignar a una variable el resultado de una operación escribimos:
variable=`expr operación`
Es importante fijarse en que no hay espacio en blanco entre la variable y el signo =, así como entre 
el signo = y el acento grave ( ` ). De la misma manera, no hay espacio en blanco entre el acento 
grave y la palabra expr
Los operadores son:

• + para sumar

• ­ para restar

• * para multiplicar

• / para dividir (división entera)

• % para obtener el resto de la división entera
Por ser un carácter con un significado especial, * debe ir precedido por la barra invertida o 
backslash ( \ )

#!/bin/bash

echo “escribe dos números”


read n1 n2

suma=`expr $n1 + $n2`


producto=`expr $n1 \* $n2`

echo ”la suma es $suma y el producto $producto”

Nota: entre los operandos y los operadores hay un espacio en blanco.
Ejercicio:
Modifica este programa quitando los espacios en blanco entre los operadores y los operandos y 
observa qué ocurre

$(( ))
La forma de hacer operaciones así es la siguiente:
$((expresion))
Los operadores son los mismos que en la forma anterior, salvo que en este caso no se antepone la 
barra invertida al operador *
Ejemplo:

#!/bin/bash

echo “escribe dos números”


read n1 n2

suma=$(( $n1 + $n2 ))


producto=$(( $n1 * $n2))

echo ”la suma es $suma y el producto $producto”


En este caso tampoco hay espacio en blanco entre la variable y signo =, ni entre el signo = y el 
signo $.
Haz como en el ejercicio anterior, prueba a ejecutar el programa quitando los espacios en blanco 
entre los operadores y los operandos.

$[ ]
Este comando es muy similar al anterior, sólo cambia un poco la sintaxis. Con este operador 
tampoco se escribe la barra invertida antes del operador *

#!/bin/bash

echo “escribe dos números”


read n1 n2

suma=$[ $n1 + $n2 ]


producto=$[ $n1 * $n2 ]

echo ”la suma es $suma y el producto $producto”

No hay espacios en blanco entre la variable y el operador =, ni entre el operador = y el signo $

Condiciones
La sintaxis general de if es la siguiente (lo que aparece entre corchetes es opcional)
if condición
then
orden1

ordenN
[elif condición2
then
orden2
...
ordenN
]

[else
orden1

ordenN
]
fi
A cada if le acompaña un then. then puede aparecer en la línea siguiente a if o en la misma lína, 
escribiendo un punto y coma ( ; ) entre la condición y el then. La primera oden después de then
puede aparecer en la misma línea que then.
La orden fi cierra el if.

Si tenemos un if simple, con condición y sin elif (que es la contracción de else if) ni else, 
tenemos lo siguiente:
if condición; then
orden
fi
Si tenemos una orden que se ejecuta si al condición es cierta y otra cuando la condición es falsa, 
escribiremos algo así
if condición; then
orden1
else
orden2
fi
Las instrucciones que se ejecutan si la condición es cierta son las que están entre then y else. 
Las instrucciones que se ejecutan si la condición es falsa son las que están entre else y fi.
Si tenemos una orden que se ejecuta si la condición es cierta y si siendo falsa la condición queremos 
evaluar otra condición, podemos escribir otro if dentro de else, o usar elif. En el siguiente 
ejemplo aparecen las dos formas, que son equivalentes
if condición;1 then if condición1; then
orden1 orden1
else elif condició2; then
if condición2; then orden2
orden2 else
else orden3
orden3 fi
fi
fi
Dento del primer else incluimos un if que ha  elif aparece como otra posible instrucción 
de tener su then y su fi, aparte del primer if.  dentro de la estructura de if, por tanto sólo hay 
Por tanto hay dos fi un fi

Condiciones 
Las condiciones se escriben tras la palabra reservada test o escribiéndoas entre corchetes. Si se usan 
corchetes, es importante dejar un espacio en blanco entre la condición y los corchtes
Ejemplo:
if test condición; then
if [ condición ]; then
Veremos tres tipos de condiciones
• de números
• de cadenas
• de ficheros
Cada una de ellas tendrá su propia sintaxis, pero para todas ellas los siguientes operadores se 
pueden usar:
• -o  que es el OR lógico
• -a que es el AND lógico
• ! que es el NOT lógico

Condiciones de números
Los operadores para números son:
• -lt menor que (del inglés lower than)
• -le menor o igual (del inglés lower or equal)
• -gt mayor que (del inglés greater than)
• -ge mayor o igual (del inglés greater or equal)
• -eq igual (del inglés equal)
• -ne distinto (del inglés not equal)
Ejemplo:
Programa que pide dos números y dice si son iguales o no
#!/bin/bash #!/bin/bash

echo introduce dos números echo introduce dos números


read a b read a b

if [ $a -eq $b ]; then if test ! $a -eq $b; then


echo son iguales echo son distintos
else else
echo son distintos echo son iguales
fi fi
Como puedes ver, el uso de los corchetes es  Este ejemplo está hecho con test. Como 
como el de paréntesis, salvo que hay que dejar  puedes ver se escribe test y a continuación la 
un espacio en blanco entre los corchetes y los  condición tal cual. Este ejemplo está hecho 
caracteres de la condición usando el operador de negación ! para ilustrar 
cómo se usa, sería análogo usando corchtes (por 
supuesto se podría haber hecho usando -ne)
Ejercicio
Haz un programa que pida dos números y diga si son iguales, y si no lo son, que diga cuál es el 
mayor (usa elif)
Condiciones de cadenas de caracteres
Los operadores para cadenas de caracteres son:
• = iguales
• != distintas
• > mayor que (alfabéticamente mayor, es decir, aparecería después en el diccionario)
• < menor que (alfabéticamente menor, es decir, aparecería antes en el diccionario)
• -z comprueba si la cadena de caracteres es nula
• -n comprueba si la cadena de caracteres no es nula
Como los caracteres < y > también tienen el significado de redirección, para que no hay confusión 
se escriben precedidos de la barra invertida (backslash) \
Ejemplo:
Programa que reciba dos cadenas de caracteres y diga si alguna es nula y si no lo es ninguna, cuál es 
la mayor alfabéticamente

#!/bin/bash

echo “escribe dos cadenas”


read c1 c2

if [ -z “$c1” -o -z “$c2” ]; then


echo una de las dos cadenas es nula
elif [ “$c1” \> “$c2” ]; then
echo $c1 es mayor alfabeticamente
else
echo $c2 es mayor alfabeticamente
fi

Escríbelo tal cual y quitando las comillas de las variables ¿qué ocurre?
Ejercicios
• Haz un programa que reciba dos cadenas como parámetros y en caso de que alguna de las 
dos sea nula diga cuál. Si las dos son no nulas, que diga son iguales o distintas
• Haz un programa que pida el nombre y el año de nacimiento y salude al usuario diciéndole 
cuántos años tiene y si es mayor de edad. Si el nombre está vacío le dirá que tiene que 
introducir el nombre.

Condiciones de ficheros
Los operadores para ficheros son:
• -d  comprueba si es un directorio 
• -e  comprueba si el archivo existe 
• -f comprueba si es un archivo ordinario 
• -s  comprueba si el archivo tiene longitud mayor a cero 
• -r comprueba si tiene permisos de lectura (el fichero es legible para el usuario que 
ejecuta el script)
• -w  comprueba si tiene permisos de escritura (el fichero es modificable para el usuario 
que ejecuta el script)
• -x  comprueba si tiene permisos de ejecución (el fichero es ejecutable ve para el usuario 
que ejecuta el script)
Ejemplo:
Programa que recibe un fichero como argumento y dice si es un directorio o un fichero ordinario u 
otra cosa

#!/bin/bash

if test -d $1; then


echo es un directorio
elif test -f $1; then
echo es un fichero ordinario
else
echo no es ni un fichero ordinario ni un directorio
fi

Ejercicios
• Haz un programa que pida un fichero y diga si es legible, modificable o ejecutable
• Haz un programa que pida un directorio, si no tiene permisos de ejecución se los dé y cree 
dentro de él un fichero con permisos de ejecución

Bucle for
La sintaxis del bucle for es la siguiente
for variable in lista
do
orden
done
lista puede ser una lista de palabras o números, separados por espacios en blanco, y la variable va 
tomando cada uno de los valores de la lista. Las ordenes entre do y donde se hacen para cada uno de 
los valores de la lista
Ejemplo
Un programa de shell que imprime los números del 1 al 10
#!/bin/bash

for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done

Ejemplo:
¿Recuerdas el ejercicio de ver los permisos de un fichero? Se puede hacer fácilmente para todos los 
ficheros del directorio de la siguient manera

#!/bin/bash

for i in *
do
aquí va tu código
del ejercicio que hiciste
salvo que el fichero que tienes
que evaluar es $i
done

i va tomando cada uno de los valores de los elementos del directorio, porque * puede ser cualquier 
valor (es un carácter comodín que representa cualquier valor)
Ejercicio
• Haz un programa que para cada uno de los parámetros que reciba, diga si es fichero o 
directorio
• En una variable se puede guardar el contenido de un fichero con la instrucción
variable=`cat fichero`
Usa ésto último y el bucle for para hacer un programa que pida una palabra y diga cuántas 
veces aparece en un fichero.
• Con la instrucción
variable=`cat /etc/passwd | cut ­d: ­f1`
puedes guardar en una variable los usuarios del sistema (razona por qué). Haz un programa 
que cuente cuántos usuarios hay en el sistema

You might also like