Como crear Script

+1
+1
-1

Me gustaria crear un buen COMO en el que todo el mundo participemos y posteemos algunos de nuestros script para ayudarnos un poco entre todos.
En primer lugar, voy a tratar de explicar un poco qué es y cómo se hace un bash script.

Un bash script es un pequeño programa escrito en el lenguaje de nuestra consola bash. Es una herramienta muy potente y util que sirve principalmente para automatizar tareas comunes que hacemos de forma manual.

Cómo se hacen los bash script:

Lo primero es indicar el lugar donde se encuentra nuestra bash, por defecto se esta en /bin/bash. Esto lo hacemos del siguiente modo #! /bin/bash .#! -> con ésto le decimos a nuestra consola donde se encuentra un determinado programa, en este caso, nuestra propia shell. Tras ésto empezamos con las sentencias.

Podemos usar estructura de control (if, else, while, until ...) y variables al igual que en la mayoria de los lenguajes de programación. Las variables son fuertemente tipadas (una vez definido su tipo no podra cambiarse) y no hay que especificar su tipo (la shell es la encargada de esa labor).

Las instrucciones que podemos emplear son las mismas que empeariamos en nuestra consola, pongo un ejemplo de un script sencillito que nos actualiza el sistema:

#! /bin/bash
sudo aptitude update & sudo aptitude upgrade & sudo aptitude dist-upgrade

Abrimos nuestro editor de texto preferido (por ejemplo gedit) y copiamos ese script, lo guardamos por ejemplo con el nombre de Actualizar.sh
Para ejecutarlo podemos hacer lo siguiente, desde la consola nos situamos en el directorio donde guardamos el script y tecleando sh Actualizar.sh lo ejecutamos. Es posible que no tengamos permisos de ejecucion para ese script y lo solucionamos tecleando en consola chmod +x Actualiza.sh.
Si integrar nuestro script en el sistema de forma que podamos llamarle desde cualquier lugar y poniendo solo su nombre, lo movemos a la carpeta /bin
Hecho eso, bastara con poner Actualiza.sh desde cualquier lugar para que se ejecute.

Al igual que en la consola podemos usar tuberias, esto es pasarle la salida de un comando a otro. Para ello usamos este simbolo | un ejemplo:
ls -F | grep "/"
Este comando mostrara en pantalla sólo directorios. ls -F muestra todos los archivos añadiendo al final de cada directorio el caracter espaciador (/). grep toma la salida de ls -F y filtra todos los archivos que contengan el caracter /

Podemos mostrar la salida de un programa por otro medio que no sea el estándar (pantalla) por ejemplo a un fichero. Para ello usamos el caracter > . Por ejemplo:
ls --all > ficheros.txt
Esto creara un archivo llamado ficheros.txt conteniendo el resultado de ls --all
Del mismo modo con el caracter < variamos el flujo de entrada (por defecto el teclado).

Para crarnos variables, simplemente ponemos el nombre de la variable que queramos y le asignamos un valor. Si queremos usarla posteriormente deberemos anteponer $ al nombre de la variable. Un ejemplo que ilustra el uso de variables es el siguiente:
#!/bin/bash
Variable="Mi primera variable"
echo $Variable

Hay que notar que echo imprime por pantalla aquello que se le pasa.

Podemos declararnos funciones, como en cualquier lenguaje de programacion. Para ello usamos la palabra function:
#!/bin/bash
Saludo=Hola
function hola {
local Saludo=Buenas
echo $Saludo
}
echo $Saludo
hola
echo $Saludo

Las variables que se encuentran dentro de la funcion son variables locales y ocultan a las variables globales (externas a la función). Así cuando definimos la variable local Saludos, estamos diciendo que la variable Saludo es una nueva variable y el sistema la tratara como una variable nueva.

Uso de estructuras de control:
If -> Esta es la estructura de control mas basica. Evalúa una condición y ejecuta un código dependiendo de si la condición es verdadera o falsa. La sitaxis es la siguiente:

if [ condición booleana]; then
sentencias
fi

Adicionalmente podemos usar la sentencia else que ejecuta codigo en caso de que la condicion no se cumpla:

if [condicion booleana]; then
sentencias
else
sentencias
fi

Podemos anidar varios else, del siguiente modo:

if [condicion booleana]; then
sentencias
elif [condicion booleana]; then
sentencias
else
sentencias
fi

Un ejemplo que ilustra el uso de este tipo de estructuras de control:

#!/bin/bash
A="hola"
B="buenas"
if [ "$A" = "$B" ]; then
echo Ambos son iguales
elif [ "$A" = "Buenos dias"] then
echo -e "$A vale buenos dias"
else
echo Ambos son distintos
fi

Otro tipo de estructura de control es el while. Este bucle se ejecuta indefinidamente mientras la condicion sea cierta. Esta es la sintaxis:

while [condicion booleana]; do
sentencias
done

Ejemplo:

#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done

Para que veais lo sencillo que resulta hacer un script os voy a dejar uno que pide una fecha y muestra un calendario de la fecha:

#!/bin/bash
var1="Introduzca un anio"
var2=$(zenity --entry --text "$var1")
var3=$(zenity --entry --text "Introduzca un mes")
var4=$(zenity --entry --text "Introduzca un dia")
zenity --calendar --year "$var2" --day "$var4" --month "$var3"

Espero haberos ayudado a resolver algunas dudas sobre script. Si os interesa el tema os recomiendo que busqueis alguna guía en google y os animo a crearos vuestros propios script. Es muy sencillito y pueden ayudarnos en nuestra tarea cotidiana.

Un saludo

Linux: La puerta mejor cerrada es aquella que puede dejarse abierta
Mi espacio -> www.freewebs.com/ator_18

Comentarios

Imagen de merovingio

Muy buen HowTo si señor. Yo estoy haciendo un script para qemu; para que pida que sistema operativo quiere (por aora tengo W98 y XP) y segun lo que se elija ejecutar uno u otro.

Me he quedado atascado, ya que los scripts de linux no los e tocao mucho.

Alguna idea?? gracias majete

edito: Por ahora tengo hecho esto.

#script para usar varias imagenes para el qemu

echo "Que sistema operativo prefieres emular?"
echo " 1.Windows XP"
echo " 2.Windows 98"
echo " 3.Salir"

#se elige una de las opciones

echo "Opcion:"
read opccion

#se lee la opcion elegida

#se ejecuta segun la opcion elegida. Destacar nombre de la imagen

case $opccion in
1 qemu -user-net -localtime -m 1024 -hda wxp.img -cdrom /dev/cdrom -boot c

2 qemu -user-net -localtime -m 1024 -hda w98.img -cdrom /dev/cdrom -boot c

3 exit

#FIN

Imagen de Anónimo

yo tambien se un poquito de bash ¿me podrias explicar mejor eso de el while? tengo un pequeño script instalador y me gustaria q cuando dan a cancelar cuando le dice vuelva a intentarlo siempre le salga otra vez el menu... lo he hecho con 2 intentos ya q no se hacer q lo haga siempre. Gracias

Imagen de joseluis

Tal vez con un ejemplo veas como funciona.


#!/bin/bash

i=1
while true ; # bucle infinito
do

echo "Iteracion $i"
i=$((1+$i)) # esto no es más que un contador
# por hacer algo...

echo "¿Salir S/N?"
read respuesta
if [ "$respuesta" = "S" ]; then
break # salimos del bucle
fi
done # Sentencia de cierre del bucle

-----
Lectura obligada:


Imagen de aledelgal

Pues yo estoy INTENTANDO hacer uno que me deje elegir qué radio quiero escuchar, pero no sé qué pasa que no me funciona. Ahí va el script

#!/bin/bash

echo ""
echo "Script para seleccionar qué radio queremos escuchar"
echo""
echo " 1 -> Los 40 principales"
echo " 2 -> Cadena dial"
echo " 3 -> Europa FM"
echo ""
echo "Seleccione una de las radios "
read radio
if["$radio"= "1"]; then
mplayer -playlist http://www.los40.com/nuevo_player/40Principales.asx
elif ["$radio"= "2"]; then
mplayer -playlist http://www.los40.com/nuevo_player/dial.asx
elif ["$radio"= "3"]; then
mplayer -playlist http://www.ondacero.es/europafm.asx
fi

Al ejecutarlo me da el siguiente error:
Seleccione una de las radios
2
/bin/radios.sh: line 12: syntax error near unexpected token `then'
/bin/radios.sh: line 12: `if["$radio"= "1"]; then'

Supongo que será una tontería pero es que no tengo ni idea de hacer scripts, es el primero que hago.
Muchas gracias y un saludo.

][ALeX][

][ALeX][

Imagen de ator_18

#!/bin/bash

echo ""
echo "Script para seleccionar qué radio queremos escuchar"
echo""
echo " 1 -> Los 40 principales"
echo " 2 -> Cadena dial"
echo " 3 -> Europa FM"
echo ""
echo "Seleccione una de las radios "
read radio
if [ $radio = "1" ]
then
mplayer -playlist http://www.los40.com/nuevo_player/40Principales.asx
elif [ $radio = "2" ]
then
mplayer -playlist http://www.los40.com/nuevo_player/dial.asx
elif [ $radio = "3" ]
then
mplayer -playlist http://www.ondacero.es/europafm.asx
fi

Tenias algun error. Te los comentare, asi en futuros script no te sucedera.

- Cuando estas en una estructura if [ expresion ] es muy importante el espaciado. Entre el if y [ debe haber un espacio. Entre los corchetes tambien. if [ expresion ] es correcto. Te pongo ejemplos donde no seria correcto:
- if[ expresion ]
- if [expresion]
- if[expresion]
Debes tener cuidado con los espacios en este tipo de condicionales.

Otro error fue el siguiente. Supongo que no se explico demasiado bien en el post, asi que tratare de aclarar alguna duda.

Cuando en un script usamos los parentesis (), lo que estamos haciendo es llamar a una subshell que ejecuta esa orden. Me explico.
suma = (a + b)
Lo que hariamos en este caso seria crear una variable suma y le damos un valor. Como hemos usado (), esa shell llama a otra shell que ejecuta lo que se encuentra entre parentesis (en nuestro caso a + b) y devuelve el resultado a la shell principal.

Cuando usamos [] lo que estamos haciendo es evaluar. Equivale a usar la orden test. Se utilizan los corchetes simplemente por abreviar, pero puede resultar algo lioso si no se comprende.
El ultimo valor devuelto por cualquier operacion en el shell lo encontramos en $?
Si hacemos lo siguiente:

# asignamos un valor a la variable saludo
saludo="hola"
# imprimimos el contenido de la variable
echo $saludo
# Comprobamos si saludo vale hola
test $saludo = "hola"
# imprimimos el resultado de la comprobacion
echo $?
# NOTA: 0 = true y 1 = false
# comprobamos que pasa si hacemos una comprobacion erronea
test $saludo = "adios"
# imprimimos el resultado de la comprobacion
echo $?

Vamos a hacer lo mismo usando [] en vez de test

# asignamos un valor a la variable saludo
saludo="hola"
# imprimimos el contenido de la variable
echo $saludo
# Comprobamos si saludo vale hola
[ $saludo = "hola" ]
# imprimimos el resultado de la comprobacion
echo $?
# NOTA: 0 = true y 1 = false
# comprobamos que pasa si hacemos una comprobacion erronea
[ $saludo = "adios" ]
# imprimimos el resultado de la comprobacion
echo $?

Espero que se haya comprendido esto. Ahora bien, el error que cometiste fue el siguiente.
Cuando haces [ "$radio" = "1" ] esta comparando 2 cadenas y no el resultado de la variable como tu pretendias. Al poner "$radio" estas diciendole a la shell que es una cadena cuyo valor es $radio. La solucion es quitar las comillas, de ese modo le decimos a la shell, ¿el contenido de la variable radio es igual a 1? y la shell guarda el resultado de su comprobacion en $? y lo usa para evaluar las condiciones.

Si me permites un consejillo, ten mucho cuidado con la tabulacion y el espaciado, aunque parezca solo estetico ayuda mucho a comprender el codigo y detectar errores facilmente, ademas en ciertas ocasiones es necesario si queremos que funcione correctamente.

Si no es demasiada molestia, cuando termines el script cpn todas las emisoras podrias postearlo para que todos disfrutemos de él.

Espero haberte ayudado, un saludo

Linux: La puerta mejor cerrada es aquella que puede dejarse abierta

Imagen de aledelgal

Ya funciona a la perfección. Las aclaracines han sido muy buenas.

][ALeX][

][ALeX][

Imagen de aledelgal

Ya funciona a la perfección. Las aclaraciones han sido muy buenas.

][ALeX][

][ALeX][

Imagen de aledelgal

Ya funciona a la perfección. Las aclaracines han sido muy buenas.

][ALeX][

][ALeX][

Imagen de joseluis


#!/bin/bash
# Con la línea anterior se indica cuál es el
# intérprete que ejecutará el script.

lista=`ls` # Utiliza el acento grave. Sirve para ejecutar
# un comando y poder guardar su resultado en una variable.
# Por cierto, esto es un comentario.

for i in $lista ;
do
# Este bucle se ejecuta una vez por cada nombre
# de fichero que haya en la variable lista
# Con el símbolo del $ antes del nombre de la variable
# indicamos que queremos acceder al resultado
if [ $i = "README.txt" ]; then
echo "Por favor lea en primer lugar el fichero README.txt"
less README.txt # Utiliza el paginador less para mostrar el fichero
elif [ $i != "INSTALL.txt" ]; then
echo $i
# El comando echo sirve para mostrar
# algo por pantalla. En este caso el nombre del fichero
else
echo "Por favor revise el fichero INSTALL.txt"
fi
# Con el if verificamos si se cumple una condición.
# Después de poner la condición del if se debe poner then
# Puede llevar o no un else (los elif son un else + un if)
# Un if siempre se cierra con fi
done

# Este script no sirve para nada, salvo quizás para ilustrar
# como se pueden utilizar bucles, se ponen condiciones, se
# recupera la salida de un comando, se ponen comentarios en
# el script y poco más.
# Utilizando zenity se puede hacer que nuestro script
# tenga otro aspecto, con ventanitas y esas cosas

directorio=`zenity --file-selector --directory \
--title "Selecciona un directorio"`
# Hemos seleccionado un directorio
cd $directorio
# Nos cambiamos a ese directorio
ls | zenity --text-info --title "Contenido de $directorio"
# Ejecutamos un ls para ver su contenido y se lo redirigimos
# a zenity para que nos lo muestre en una ventana.

# Más información sobre zenity en man zenity o zenity --help

Por cierto, muy buena tu iniciativa.

-------
¿Jazztel? NO Gracias. A ver si te enteras


Imagen de ator_18

Gran aportacion joseluis.
Cometiste un pequeño error de sitaxis aqui:
directorio=`zenity --file-selector --directory \
--title "Selecciona un directorio"`
Supongo que por las prisas, cuando escribo post a mi me pasa con mucha frecuencia.
Seria del siguiente modo:
directorio=`zenity --file-selection --directory \
--title "Selecciona un directorio"`

Por cierto, para quien no lo sepa, la barra invertida \ indica que aunque hayamos ido a la linea siguiente la orden es seguida. Me explico. La frase anterior seria igual a:
directorio=`zenity --file-selection --directory --title "Sel ..."`

Y seria lo mismo que hacer:
directorio=`zenity \
--file-selection --directory \
--title "Selecciona un directorio"`

Linux: La puerta mejor cerrada es aquella que puede dejarse abierta