Professional Documents
Culture Documents
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
Ejecútalo de la siguiente manera
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
$ 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
Para la instrucción echo se pueden usar comillas o no, la diferencia está en lo sigueinte
#!/bin/bash
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
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
$[ ]
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
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
#!/bin/bash
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
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