Sirviendo información sobre Linux desde 1998

Bash (IV) - Estructuras de control y bucles

Informacion En nuestra cuarta entrega sobre la introduccion a el interprete de comandos Bash, vamos a ver una pequeña introduccion a las estructuras de control y bucles en Bash. Estas construcciones nos ayudan a controlar la ejecucion de un script y a obtener diversos resultados dependiendo de las condiciones que se cumplan o no cuando ejecutamos el script.

En Bash existen estas construcciones para controlar el flujo de ejecucion de un script:

  • if/else: Ejecuta una serie de comandos dependiendo si una cierta condicion se cumple o no.
  • for: Ejecuta una serie de comandos un numero determinado de veces.
  • while: Ejecuta una seria de comandos mientras que una determinada condicion sea cumpla.
  • until: Ejecuta una serie de comandos hasta que una determinada condicion se cumpla.
  • case: Ejecuta una o varias listas de comandos dependiendo del valor de una variable.
  • select: Permite seleccionar al usuario una opcion de una lista de opciones en un menu.

La mayoria de condiciones utilizadas con estas construcciones son comparaciones de cadenas alfanumericas o numericas, valores de terminacion de comandos y comprobaciones de atributos de ficheros. Antes de seguir viendo como estas construcciones se pueden utilizar, vamos a ver como las condiciones se pueden definir.

Comparaciones de cadenas alfanumericas

Operador		Verdad (TRUE) si:
------------------------------------------
cadena1 = cadena2	cadena1 es igual a cadena2
cadena1 != cadena2	cadena1 no es igual a cadena2
cadena1 < cadena2	cadena1 es menor que cadena2
cadena1 > cadena 2	cadena1 es mayor que cadena 2
-n cadena1		cadena1 no es igual al valor nulo (longitud mayorque 0)
-z cadena1		cadena1 tiene un valor nulo (longitud 0)

Comparacion de valores numericos

Operador		Verdad (TRUE) si:
------------------------------------------
x -lt y			x menor que y
x -le y			x menor o igual que y
x -eq y			x igual que y
x -ge y			x mayor o igual que y
x -gt y			x mayor que y
x -ne y			x no igual que y

Comprobacion de atributos de fichero

Operador		Verdad (TRUE) si:
------------------------------------------
-d fichero		fichero existe y es un directorio
-e fichero		fichero existe
-f fichero		fichero existe y es un fichero regular (no un
			directorio, u otro tipo de fichero especial)

-r fichero		Tienes permiso de lectura en fichero
-s fichero		fichero existe y no esta vacio
-w fichero		Tienes permiso de escritura en fichero
-x fichero		Tienes permiso de ejecucion en fichero (o de busqueda
			si es un directorio)

-O fichero		Eres el dueño del fichero
-G fichero		El grupo del fichero es igual al tuyo.

fichero1 -nt fichero2	fichero1 es mas reciente que fichero2
fichero1 -ot fichero2	fichero1 es mas antiguo que fichero2

Podemos combinar varias condiciones con los simbolos '&&' (AND) y '||' (OR), y negar una condicion con '!'. Unos ejemplos mas adelante aclararan como utilizarlos.

if/else

La sintaxis de esta construccion es la siguiente:

if "condicion"
then
  "comandos"
[elif "condicion"
then
  "comandos"]
[else
  "comandos"]
fi

Como ya hemos dicho, podemos comprobar los valores de terminacion de un comando, y comparar cadenas alfanumericas/numericas y atributos de ficheros. Nada mejor que unos ejemplos para aclararnos las ideas.

#!/bin/bash
#
# Comprobando terminacion de un comando
#

DIRECTORIO="/tmp/test"

COMANDO="/bin/mkdir $DIRECTORIO"

if $COMANDO
    then
    echo "$DIRECTORIO ha sido creado"
else
    echo "$DIRECTORIO no pudo ser creado"
fi
#!/bin/bash
#
# Comparacion de cadenas alfanumericas
#

CADENA1="uno"
CADENA2="dos"
CADENA3=""

if [ $CADENA1 = $CADENA2 ]; then
    echo "\$CADENA1 es igual a \$CADENA2"

elif [ $CADENA1 != $CADENA2 ]; then
    echo "\$CADENA1 no es igual a \$CADENA2"

fi

if [ -z $CADENA3 ]; then
    echo "\$CADENA3 esta vacia"
fi

#!/bin/bash
#
# Comparacion de valores numericos
#

let NUM1=1
let NUM2=2
let NUM3=3

if [ $NUM1 -ne $NUM2 ] && [ $NUM1 -ne $NUM3 ]; then
    echo "\$NUM1 es diferente a \$NUM2 y \$NUM3"
fi

if [ $NUM1 -lt $NUM3 ]; then
    echo "\$NUM1 es menor que \$NUM3"
fi

for

La sintaxis de esta construccion es la siguiente:

for nombre [in lista]
do
   comandos que pueden utilizar $nombre
done

Un ejemplo nos aclarara las cosas. Vamos a listar informacion en el DNS de una lista de direcciones web:

#!/bin/bash

for HOST in www.google.com www.altavista.com www.yahoo.com
do
  echo "-----------------------"
  echo $HOST
  echo "-----------------------"
  
  /usr/bin/host $HOST
  echo "-----------------------"

done

while

La sintaxis de esta construccion es la siguiente:

while condicion
do
  comandos
done

Un ejemplo simple con while en donde escribimos el valor de una variable 10 veces, despues de incrementar su valor:

#!/bin/bash

NUM=0

while [ $NUM -le 10 ]; do
    echo "\$NUM: $NUM"
    let NUM=$NUM+1
done

until

La sintaxis de esta construccion es la siguiente:

until condicion; do
   comandos
done

Un ejemplo simple con until en donde escribimos el valor de una variable 10 veces, despues de incrementar su valor:

#!/bin/bash

NUM=0

until [ $NUM -gt 10 ]; do
    echo "\$NUM: $NUM"
    let NUM=$NUM+1
done

case

La sintaxis de esta construccion es la siguiente:

case expresion in
     caso_1 )
        comandos;;
     caso_2 ) 
	comandos;;
     ......
esac  

Un ejemplo simple con case para aclarar las cosas:

#!/bin/bash

for NUM in 0 1 2 3
do
  case $NUM in
      0)
	  echo "\$NUM es igual a cero";;
      1)
	  echo "\$NUM es igual a uno";;
      2)
	  echo "\$NUM es igual a dos";;
      3)
	  echo "\$NUM es igual a tres";;
  esac
done

select

La sintaxis de esta construccion es la siguiente:

select nombre [in lista]
do
  comandos que pueden utilizar $nombre
done

Un ejemplo simple para aclarar las cosas.

#!/bin/bash

select OPCION in opcion_1 opcion_2 opcion_3
  do
  if [ $OPCION ]; then
      echo "Opcion elegida: $OPCION"
      break
  else
      echo "Opcion no valida"
  fi
done

Bueno esto es todo por hoy en nuestra introduccion a Bash. En el proximo articulo de esta serie veremos diferentes aspectos de la entrada y salida de datos en un script Bash.

Libros recomendados sobre el tema (solo en ingles), para profundizar y tener a mano todos los detalles:

Articulos anteriores relacionados:

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

pequeño detalle

Cuando se usa el operador "-z" es más seguro poner la cadena entre comillas (-z "$CADENA"), porque si ésta tiene espacios a la bash no le va hacer mucha gracia:


CADENA3="hola adios"
if [ -z "$CADENA3" ]; then
echo "\$CADENA3 esta vacia"
fi

bash: [: hola: binary operator expected

De hecho, esto se aplica a cualquier tipo de operador binario, siempre que no estés seguro si la variable tiene espacios o no.

Mi primer intento xD

Hola, acabo de intentar crear mi primer script, que básicamente junta archivos de hacha, ya que me daba mucho palo ir uno por uno, he ido a google y al final aquí. Al principio funciona, pero luego no.. es algo xungo de explicar así que aquí pongo el script:

------------------------------------------
#!/bin/bash
#
# Primer script by lowis! xD
# Enganxa arxius creats amb hacha jojojojo
#

NUM=1

while [ $NUM -le 13 ]; do
echo "alla vamos jojojo"
hoz -p elfen_lied_0$NUM.rar.0 elfen_lied_0$NUM.rar.1
let NUM=$NUM+1
done
------------------------------------------

Los archivos son todos "elfen_lied_01.rar.0", el problema esta en el "0" antes del 1, ya que cuando llega a 10 el nombre del archivo queda así: "elfen_lied_010.rar.0" y entonces no lo encuentra ya que el archivo se llama "elfen_lied_$10.rar.0"

es algo raro de explicar xD

salu2.

Imagen de AnimAlf

Re: Mi primer intento xD

#!/bin/bash
#
# Primer script by lowis! xD
# Enganxa arxius creats amb hacha jojojojo
#

NUM=1

while [ $NUM -le 13 ]; do
  echo "alla vamos jojojo"
  [ $NUM -le 9 ] && STR=elfen_lied_0${NUM}.rar || STR=elfen_lied_${NUM}.rar
  hoz -p ${STR}.0 ${STR}.1
  let NUM=$NUM+1
done

A10

Perfecto

Gracias AnimAlf, ahora funciona como debería, no estoy muy seguro de como lo has echo, pero tiempo al tiempo, ya ire aprendiendo.

Gracias por tan buenos articulos.

salu2.

Chido trabajo

jaja estaba buscando como loco
esta informacion, no la entre
en ningun lado mas k aki.

Grax me diste un alibiane

Duda

Buenas en esta parte del codigo

[ $NUM -le 9 ] && STR=elfen_lied_0${NUM}.rar || STR=elfen_lied_${NUM}.rar

No entiendo exactamente la funcion de [ $NUM -le 9 ] , tiene pinta de ser un bucle pero no pertenece a while, for, until o if.

Si alguien puede explicar un poco, o decirme como se llama a ese tipo de logaritmo para poder investigar un poco le agradeceria.

Inukaze

Muchas gracias , necesito algo similar pero basicamente necesito que haga lo siguiente

Que lea si dentro del archivo /etc/apt/sources.list

Existe esta linea :

deb http://dl.google.com/linux/deb/ stable non-free main #Google

Si existe no hacer cambio
Pero si no existe , Agregarla , me entiendes???

Esque no tengo idea de como hacerlo , Espero que me puedan ayudar

NeoGenessis


[ $NUM -le 9 ] && STR=elfen_lied_0${NUM}.rar || STR=elfen_lied_${NUM}.rar

No entiendo exactamente la funcion de [ $NUM -le 9 ] , tiene pinta de ser un bucle pero no pertenece a while, for, until o if.

En realidad es un if:
Si se cumple : [ $NUM -le 9 ]

hace :
STR=elfen_lied_0${NUM}.rar

En caso alternativo hace :
STR=elfen_lied_${NUM}.rar

Basicamente si el primer trozo retorna 0 se ejecuta lo anidado con &&, encaso contrario lo anidado con ||.

a vere si m'el sabeu fer...

Realitza un programa BARRA que mostri en pantalla una línia amb tants asterisc (*) com indiqui el nombre introduït com argument en l’execució ‘sh BARRA nº’.

alguna pista nose... necesito algo per fer akest programa please!!

Valor infinit?

Buenas, todo lo que he encontrado aquí esta realmente bien pero.. Yo necesito crear un script que realice un par de comandos sin parar. Como lo haría?

Amigo te doy una pista, para

Amigo te doy una pista, para hacer esto necesitas un bucle for,
buscate la sintaxis en google de como se hace con bash.

El for se usa cuando se conoce la cantidad de veces que se debe repetir la acción. Espero que te sirva.

ayuda para script

Hola a todos, necesito realizar un script que guarde en un fichero el nombre de usuario, fecha y hora de inicio o cierre de sesión en el sistema de todos los usuarios menos el usuario root.
Agradecería cualquier ayuda. mi correo es roldanbrila@hotmail.com
Gracias

ayuda para script

hola, tengo que realizar un script al que le pasaremos una variable numerica 1324, y nos devolvera clave correcta.
Sino de otra manera : adios
y nos devuelve la clave es un numero

diego d

hola
estoy tratando de hacer un script q haga lo siguiente:

-Recibirá como parámetro de entrada el directorio dónde se encuentran los terminales a listar.

-Generará un fichero de salida, xxxxx.txt, con el siguiente formato:

MARCA-MODELO…

-El fichero de salida deberá estar alojado en el mismo directorio dónde se encuentran las fichas.

-EL directorio debe contener ficheros .doc, en caso contrario, deberá aparecer por pantalla un mensaje de error indicando que no hay fichas que tratar.

lo que tengo has ta ahora es esto:

#!/bin/bash
#Error(){
#echo "Error. Sintaxis de uso: $0/ directorio"
#}i
if test $# -lt 1
then
echo "No ha ingresado ningun parametro"
else
if test $1 == terminales
then

#echo "$1 Es un directorio y su contenido es el siguiente:"
#ls -1 $1 # >> terminales.txt
else
echo "El parametro ingresado no es valido"
fi
fi

te garadeceria si me ayudas se supone que mientras haya archivos .doc en el directorio terminales debo mostrar el nombre pero solo con la marca y el modelo , el nombre original del archivo es
"Homologacion MArca Modelo .doc" con lo cual necesito hacerlo para todos los .doc

gracias

observacion

no se si es en todos los linux...pero por lo menos en ubuntu server para usar comandos como -d...debe anteceder la palabra test sin los parentesis y ahi sirve! ya lo he probado.. no se por que..quien me pude orientar

xdeamx.wordpress.com

Emergencia

como guardar y salir de la programación bin/bash

Imagen de AnimAlf

Re: Emergencia

Explicate.

SaludOS

Gracias!!

Gracias a vosotros conseguí que me funcionara esto: if [ -n "$linea" ]
La linea lleva espacios, así que bash pasaba de mi cara jajaja, gracias vosotros lo solucione poniendo las doble comillas ^^

Controlar el Contador de mi Pagina Web

No estoy seguro que funcione bien, me gustaria generar un programita que llame a una direccion web por ejemplo 100 veces, alguien me puede informar como. No se nada del tema.
Gracias:
fontanellah@gmail.com

Listado

Os dejo un listado de comandos bucles etc

----------Comandos----------

ls /--Muestra las carpetas etc
ls -la/--Muestra todos los atributos de los arhivos y los arhvios ocultos
cd /--Nos dirige a donde digamos
cd ../--Nos saca hacia atras
sudo /--Ejecutamos lo que digamos como root
echo /--Muestra mensaje por pantalla
echo $Variable /--Muestra valor de la variable
echo &PATH /--Muestra las rutas
id (nombre usuario)/--Nos muestra el UID y GID asignado
whoami /--Usuario activo
man (Comando) /--Ayuda sobre el comando (:Q(para salir del man))
uname /--Informacion sistema operativo
date /--Fecha etc
date +"FECHA: %d/%m/%y" /--Fecha en modo dia,mes,año (Parametros de fecha)sleep 5
who /--quien esta conectado a mi ordenador
pwd /--Ruta actual
mkdir /--Crear directorios
mkdir [-pm] directorio /--Crear directorios, P (directorio forma recursiva), m(permisos)
rmdir [-P] directorio /--Borrar un directorio o cadena siempre que esten vacios
mv /--Cambiar el nombre de un directorio
cat /--muestra la informacion del archivo sin abrir ningun editor
cp [-fi] archivo1 archivo2 /--Copia el archivo 1 en el archivo 2 (F, fuerza la escritura del archivo , i = sobreescribir)
cp [-fi] archivo1 archivo2 carpeta /--Copia el archivo en la carpeta
cp [-R] carpeta1 carpeta2 /--Copia lo del dir1 en el 2
mv [-i] fichero1 fichero2 ... directorio /--mueve los archivos al directorio
mv [-i] directorio1 directorio1... directorio5 /--mueve el directorio 1, el 2 al ultimo directorio
rm /-- borrar
rm [-irf] fichero1 directorio1 /-- Borrar, (F, fuerza la eliminacion) (R, borra la carpeta y todo su contenido recursivamente)
ln -s fuente1 nombreenlace /--enlace simbolico (acceso directo windows)
chmod /--cambias los permisos a un fichero,directorio etc
chown /--cambiar el propietario de un fichero
find /--localizar archivos
find -name fichero /--busca los ficheros por ese nombre
find -user fichero /--busca los ficheros de ese usuario
>> /--Para no sobreescribir
2> /--Para redireccionar un error
2>/dev/null /--Papelera
| /--Tuberias
who | wc -l /-- wc pa contar las lineas
more /--ver el resultado poco a poco
tail /--visualiza las 10 ultimas lineas de un fichero
tail --lines=+8 /etc/passwd /--a partir de la linea 8 todos los datos hasta el final de la 8 hacia bajo
head /--Muesta las 10 primeras lineas de un archivo
wc /--contar lineas, palabras y letras
wc -w (palabras) -l (lineas) -c (Letras) /--depende cual pongamos cuenta una cosa u otra, sino todas
who /--nos informa sobre quien esta en nuestro pc
Grep "plabra" /--Busca dentro de un archivo la cadena de texto que le pase
grep -c (numero coincidencias) -v(lineas que lineas que no tienen la palabra a buscar) -i(no distingue mayus y minus) -n(numer_o de linea) -l(nombre de ficheros coincidentes)
tr /--Sirve para comprimir,reducir a un caracter una cadena de caracteres repetidos o para sustituir un caracter por otro
tr -s cadena1 (sustituye carcteres repetidos por uno) -s cadena1 [cadena2] (sustituye carcteres repetidos por lo de la cadena2) -d cadena1 (elimina la cadena)
Sort /--Ordenar
sort -f(ignora Mayus y minus) -r(invierte el orden) -t(caracter)(caracter separado) -o(especificamos archivo de salida) -k n1,n2 (ordenacion por columnas, n1,n2 (numeros)) -u (elimina las lineas repetidas)
tee /--muestra la informacion intermedia en las tuberias
cut /--Extraer informacion de las lineas de un archivo
cut -d(caracter) -c (n-n2)(lista columnas a seleccionar) -f (n) (numero de columna a extraer)
history /--Muestra los comandos utilizados
cmp /--Compara ficheros
echo $? /--Nos muestra si la ejecucion de la instruccion a dado un resultado incorrecto
sleep 5 /--Retarda en segundos el script

--------Scripts---Ejemplos-----
Hacer un chmod 744 cuando terminemos
..................................
#!/bin/bash

clear

echo -n "Introduce un numero: "
read dato1

echo

if [ $dato1 -gt 10 ]
then
echo "El dato introducido es mayor que diez"
else
echo "EL dato introducico es menor que diez"
fi

..........(While)................
#!/bin/bash

clear

contador=0
while [ $contador -lt 10 ]
do

echo " la cuenta va por $contador "
let contador++
if [ $contador -eq 5 ]
then
break
fi

done

.......(While para leer)..........
#!/bin/bash

clear

while read linea
do
bla
bla
bla

done < nombrearchivo

..........(FOR)...................
#!/bin/bash

clear

for i in $(seq 1 1 20)
do

echo "estoy en la iteracion numero $i"

done

.....(FOR para leer archivos)....
bin/bash

clear

for linea in $(cat alumnos.txt)
do

echo "$linea"

done

..............................................
#!/bin/bash

fecha=$(date +'%Y')

echo "estamos en el año $fecha"

.......Evaluar la expresion..(No dividr con expr)........
#!/bin/bash

a=7
a=5

expr $a + $b
echo $a + $b | bc
echo "scale=2;$a/$b" |bc

.................Comando Case...........
#!/bin/bash

clear

echo -n "Introduce un numero del 1 al 6: "
read num

case $num in
1)
echo "uno"
;;
2)
echo "dos"
;;
3)
echo "tres"
;;
4)
echo "cuatro"
;;
5)
echo "cinco"
;;
6)
echo "seis"
;;
*) (FUnciona como el else)
echo "he dicho 1 y 6"
;;
esac

--------Gestion de Usuarios--------
su root /--Pasa a usuario root (salir con exit)I
su - root /--Pasa a usuario root desde la carpeta del usuario
groupadd /--Crear el grupo
groupdel /--Borra el grupo
useradd /--Crea el usuario
userdel -r /--borra el usuario
useradd -m(Crear carpeta donde corresponde (/home)) -g(Asignamos un grupo al usuario) -s(asignamos la shell)
useradd -m -g "nombre grupo" -s /bin/bash "nombre usuario"
sudo passwd "nombre usuario" /--Darle o cambiarle la contraseña al usuario nuevo
ssh sergio@ip /--conectarse a ...
scp origen destino/--Comando copy por ssh
scp /home/sergio/prueba.txt sergio@192.168.1.21:/home/sergio --Enviar
scp sergio@192.168.1.21:/home/sergio/prueba.txt /home/sergio -- Recibir
./--Ejecutar

-----------Empaquetador--------
tar /--empaquetador
tar opciones paquete archivos /--Formato
-c crear archivo empaquetado
-x extraer archivo empaquetado
-f nombre del archivo (crear o desempaquetar)
-z comprimir con gzip
-j comprimir con bzip
-v visualiza el empaquetamiento
-t listar contenido de un archivo empaquetado

tar -cvzf comprimidos/mihome.tar.gz /home/sergio
tar -xvzf comprimidos/mihome.tar.gz -C /home/sergio/descomprimidos

-----------Informacion--------
-http://www.freealts.com/
-En linux no hay realmente extensiones
-Si un archivo tiene un . delante esta oculto '.themes'
-Para editar con el (editor gedit) ponemos "ejemplo:gedit /etc/passwd"

-Permisos:
Estan en grupos de 3
drwxr-x-w-
d rwx r-x -w-

d(informacion archivo o directorio o etc)
d "Directorio"
- "Archivo normal"
c "Archivo caracter"
| "Enlace simbolico"
- "Sin permiso"
r "Lectura"
W "Escritura"
x "Ejecucion"

rwx "Permisos del propietario del archivo" = u
r-x "Permisos del grupo" = g
-w- "Permisos para el resto de gente" = o

Todos los usuarios grupos etc con 'a'

+ añade permiso
- retira permiso
= asigna permiso (solo ese y machaca)

ejemplo: chmod u=rwx,g+r, o=r fich1

////Binario/////
4 2 1
----------
0| 0 0 0
1| 0 0 1
2| 0 1 0
3| 0 1 1
4| 1 0 0
5| 1 0 1
6| 1 1 0
7| 1 1 1

por ejemplo el fichero con permisos r-x --x rwx seria
--- --- ---
101 001 111
--- --- ---
5 1 7
con lo que seria el permiso 517

echo hola > fichero.txt
echo adios > fichero.txt si lo hacemos por segunda vez sobreescribe
para que no sobreescriba

echo adios >> fichero.txt

who quien esta conectado
who >> fichero.txt

cat fich.txt 2> fichero.txt

-----------Ejemplos generales-----------------
-date +"FECHA: %d/%m/%y%nHORA: %T%nDIA: %A" (Nos dice la fecha, hora y el dia)
-mkdir antonio marisa (Me crea 2 directorios uno antonio y uno marisa)
-mkdir -p antonio/marisa (Me crea 1 directorio antonio y dentro de este 1 llamado marisa)
-cat ../archivo.txt (../ los que quiera) (muestra el archivo que esta un nivel superior)
-cat /etc/paswd | tail MUestra las 10 ultimas lineas del archivo paswd
-find /usr -name "a*" | wc -l > num.txt
-grep "velocidad" coches.txt motos.txt (busca en varios ficheros)
-cat nombres.txt | grep -n "Marta" |tee auxiliar.txt |wc -l
-cat nombres.txt | tr -s ":" "*" | sort -frt* -k2,2
-ls -R > direct.txt 2> /dev/null

--------Simbolos---------
> --Redirecciona la salida de datos
| --va uniendo instrucciones

-Metacaracteres-
* --Sustituye a cualquier tipo de caracteres
? --Sustituye a un solo caracter
[]--los caracteres del interior van pasando uno tras otro

-Meta comando greep-
. --Sustituye a un caracter
* --Repeticion caracter previo
.* --Buscaria cualquier caracter como si fuese * de normal
[] --caracter incluido en los corchetes
^[] -- negacion
^ --comienzo de linea
$ --final de linea

Listado 2

Ejemplos de parametros

#!/bin/bash
clear

num=$(cat $1 | wc -w)

echo "el fichero $1 tiene $num palabras"

-------------------------------------------------------------------

#!/bin/bash
clear

if [ "$1" == "ascendente" -o "$1" == "descendente" ]
then
if [ "$1" == "ascendente" ]
then
cat palabras.txt | sort > palabrasordenadas.txt
else
cat palabras.txt | sort -r > palabrasordenadas.txt
fi

tar -czf palabrasordenadas.txt.tgz palabrasordenadas.txt
scp palabrasordenadas.txt.tgz blanca@192.168.1.25:

else
echo "el párametro introducido es incorrecto."
fi

-------------------------------------------------------------------

#!/bin/bash
clear

echo "" > resultadossergio.txt
rm resultadossergio.txt

scp sergio@192.168.1.25:/home/salva/operaciones.txt ./

while read linea
do

resul=$(echo "scale=2;$linea" | bc)
echo "el resultado de $linea es $resul" >> resultadossergio.txt

done < operaciones.txt

scp resultadossergio.txt sergio@192.168.1.25:./
-------------------------------------------------------------------

#!/bin/bash
clear
echo "" > correctas.txt
echo "" > incorrectas.txt

while read linea
do

num=$(echo $linea | aspell list | wc -l)

if [ $num -eq 0 ]
then
echo $linea >> correctas.txt
else
echo $linea >> incorrectas.txt
fi

done < $1
-------------------------------------------------------------------

#!/bin/bash
clear

if [ "$1" == "paises.txt" ]
then
case $2 in
a)
cat $1 | sort -t":" -k1,1 > paisesordenados.txt
;;
b)
cat $1 | sort -t":" -k2,2 > paisesordenados.txt
;;
c)
cat $1 | sort -t":" -k3,3 > paisesordenados.txt
;;
d)
cat $1 | sort -t":" -k4,4 > paisesordenados.txt
;;
*)
echo "el parámetro introducido no es correcto, ciao"
;;
esac

else
echo "el fichero introducido es incorrecto, ciao"
fi
-------------------------------------------------------------------

#!/bin/bash
clear

case $2 in
crear)

cat /etc/passwd | grep $1 > /dev/null
if [ $? -eq 0 ]
then
echo "el usuario $1 ya existe"
else
sudo useradd -m -g ejercicios -s /bin/bash $1
fi

;;
eliminar)
cat /etc/passwd | grep $1 > /dev/null
if [ $? -eq 0 ]
then
tar -czf $1eliminado.tgz /home/$1
scp $1eliminado.tgz ana@192.168.1.25:/home/salva
sudo userdel -r $1
else
echo "el usuario $1 no existe"
fi

;;
*)
echo "el parámetro introducido es incorrecto"
;;
esac

Listado 3

mas ejemplos de mas ejercicios

#!/bin/bash
clear

echo -n "introduce operando número 1: "
read n1
echo -n "introduce operando número 2: "
read n2
echo -n "introduce operador (suma/resta/division/multiplicacion): "
read op

case $op in
suma)
resultado=$(echo "scale=2;$n1 + $n2" | bc)
;;
resta)
resultado=$(echo "scale=2;$n1 - $n2" | bc)
;;
division)
resultado=$(echo "scale=2;$n1 / $n2" | bc)
;;
multiplicacion)
resultado=$(echo "scale=2;$n1 * $n2" | bc)
;;
*)
echo "el operador es incorrecto"
;;
esac

echo "el resultado de la operación $op de los números $n1 y $n2 es $resultado"

-------------------------------------------------------------------

#!/bin/bash

clear

echo -n "introduce frase: "
read frase

until [ "$frase" == "fin" ]

do

if [ "$frase" == "hola" ]
then
echo "bien y tú"
else
if [ "$frase" == "adiós" ]
then
echo "hasta luego"
else
if [ "$frase" == "qué tal" ]
then
echo "yo estoy bien y tú cómo estás"
else
if [ "$frase" == "qué fecha es" ]
then
date +'%d%m%y'
else
echo "TORPE"
fi
fi
fi
fi

echo -n "introduce frase: "
read frase

done
------------------------------------------------------------------

#!/bin/bash
clear

for fichero in $(ls ~/scripts/ifthenelse/*.sh)
do
echo "comprobando el fichero $fichero."
comprobar=$(cat $fichero | head -1)
if [ "$comprobar" == "#!/bin/bash" ]
then
echo "la primera línea del fichero $fichero es correcta"
else
echo "la primera línea del fichero $fichero no es correcta"
fi

done
-------------------------------------------------------------------

#!/bin/bash
clear

# sudo groupadd ejercicios 2>/dev/null

cat /etc/group | grep "ejercicios" >/dev/null

if [ $? -ne 0 ]
then
echo "el grupo no existe, lo creamos"
sudo groupadd ejercicios
else
echo "el grupo ya existe"
fi

if [ -d /home/salva/backup ]
then
echo "la carpeta ya existe"
else
echo "la carpeta no existe y la creamos"
mkdir /home/salva/backup
fi

while read linea
do
nombre=$(echo $linea | cut -d"," -f1)
echo "creando al usuario $nombre"
sudo useradd -m -g ejercicios -s /bin/bash $nombre 2>/dev/null
done < nombre-edad.txt

echo "vamos a comprimir la carpeta HOME"
tar -czf /home/salva/backup/homes-backup.tgz /home 2>/dev/null

Problemas con script

Hola, tengo un problema para resolver un script el cual me pide que dado dos archivos pasados por parametro, extraiga del primero la fila 4 y 8 y la coloque en la misma posicion del segundo archivo.
Si alguien tiene idea de como encararlo y me lo pude decir se los agradecere mucho.

saludos.

Imagen de AnimAlf

Re: Problemas con script

Empieza por el principio, escribiendo el llamamiento al interprete y luego, a ver lo que haces.

Si no resuelves tus ejercicios, mejor déjalo y dedicate a otra cosa.

Presenta lo que hayas echo.

Bucle For

Buenas noches

tengo una consulta

necesito hacer lo siguiente utilizando el comando for tengo un archivo el cual contiene

Prueba1
Prueba2

lo que no recuerdo es como utilizando el for para continuar el ciclo para que quede de la siguiente manera teniendo ya (prueba 1 y 2)

Prueba1
Prueba2
Prueba3
prueba4
Prueba5 así hasta 25

Más fácil si cabe (Mi primer intento xD)

for i in {01..13}
do
hoz -p elfen_lied_$i.rar.0 elfen_lied_$i.rar.1
done

Re: Bucle For

for i in {3..25}
do
echo prueba$i >> nombre_archivo
done

script calendario

Hola, soy nueva en ubuntu. Estoy en un curso de programación deonde me piden hacer un script en bash de tal forma que se ingrese numero de mes y año y aparezca el calendario correspondiente. Todo eso sin usar cal. No entiendo como hacer el calendario para que quede en 7 columnas (partiendo del lunes) y cambie mes a mes y año a año (con biciestos). Espero que me puedan dar algun consejo. Gracias!

Imagen de AnimAlf

Re: script calendario

utiliza date para saber el primer día indicando que es el primer días del mes, si fuese 1 de diciembre del año que viene

date -d '20141201' +'%A'

te muestra el día de la semana como palabra

si utilizas %u te lo dirá en forma numérica

http://es.wikipedia.org/wiki/A%C3%B1o_bisiesto

 if [ $[ $anyo % 4 ] -eq 0 ] ; then
      if [ $[ $anyo % 100 ] -ne 0 -o $[ $anyo % 400 ] -eq 0 ] ; then
          echo "Año Bisiesto"
      else
          echo "Año no Bisiesto"
      fi
 else
     echo "Año No Bisiesto"
 fi