| Ver tema anterior :: Ver siguiente tema |
| Autor |
Mensaje |
kolombino User destacando

Registrado: 08 Jun 2007
Mensajes: 234
|
Publicado: Lun May 26, 2008 12:57 am Título del mensaje: Breve manual de Shell scripts en Bash |
|
|
PROGRAMACIÓN SHELL BASH
La primera línea del script suele ser:
| Código: |
| #!/bin/bash (Invoca al shell) |
Se le ha de dar permiso de ejecución:
| Código: |
| chmod u+x script.sh |
Para ejecutar un script:
| Código: |
| /bin/bash script.sh |
o
Para comentar lineas:
| Código: |
| #Esta linea esta comentada |
VARIABLES DE ENTORNO EN LA SHELL DE BASH
BASH: Es la ruta donde está la shell del bash
CDPATH: Nombre de los directorios que examina la orden cd
EDITOR: Editor predeterminado que usan los programas
ENV: Almacena rutas que usa linux en busca de archivos de configuración
HISTFILE: Almacena la ruta del archivo historico
HOME: Directorio inicial
MAIL: Contiene la dirección donde se almacena el buzón de correo.
IFS: Valor que usa el shell para separar las palabras en la línea de órdenes (suele ser un espacio)
MAILCHECK: Intervalo de búsqueda de nuevo correo
PATH: Ruta de búsqueda de programas y órdenes externas
PPID: PID del proceso padre
PS1: Indicador del shell
PS2: Indicador del shell secundario
PWD: Directorio actual
TERM: Tipo de terminal que nos atiende
DECLARACIÓN DE VARIABLES
| Código: |
declare [+- opciones] [nombre[=valor]]
typeset [+- opciones] [nombre [=valor]] |
+ activa opción
- desactiva opción
Opciones:
declare -a array Indica que la variable alumnos es una lista (array)
declare -f suma Indica que la variable es una funcion
declare -i variable Declara la variable como numero
declare -r variable Indica que la variable es de solo lectura
declare -x variable Exporta la variable
LECTURA Y ESCRITURA DE VARIABLES
variable=valor
numero=15
nombre=”Paco”
echo $variable Nos muestra la variable
Para hacer que una variable sea de solo lectura:
| Código: |
declare -r variable
typeset -r variable
readonly variable
|
LECTURA ENTRADA ESTANDAR (TECLADO)
read [opciones] [variable] Lee desde teclado y almacena lo leído en una variable.
read -a nombre/frase Todo lo leído se almacena en un array
read -e nombre/frase Mete todo lo leído en la primera variable del read
read -p "mensaje" variable Muestra por pantalla un mensaje y lee los datos que se introduzcan.
| Código: |
| read -p “Introduce un numero:” numero |
| Código: |
set [opciones] [argumetos]
set -a Variable |
Cada vez que se asigna un valor a una variable ésta se exporta.
PASO DE PARÁMETROS A UN SCRIPT
script parámetros..................parámetro9
$1 $9
| Código: |
./script.sh lee.txt diskette c:
$1 $2 $3 |
Parámetros:
shift [n] Desplaza los parámetros hacia la izquierda
shift 3 Desplazaría el parámetro 3 al lugar del 1.
ORDENES DE CONTROL DE FLUJO
i
| Código: |
f [ condición ]
then
ordenes
fi
if [ condición ]
then
órdenes
else
órdenes
fi
|
| Código: |
for i in $(x); do
ordenes
done
|
| Código: |
while [ condición ]
do
ordenes
done |
| Código: |
until [ condición ]
do
ordenes
done |
| Código: |
case $variable in
1)
orden
;;
2)
orden
;;
3)
orden
;;
.
.
.
n)
orden
;;
esac |
CONSTRUCCIÓN DE EXPRESIONES
Archivos:
-d archivo La expresión es cierta si el archivo es un directorio
read -p “dime un directorio” dato
| Código: |
if [-d $dato]
then
echo “$dato es un directorio”
else
echo “$dato no es un directorio”
fi |
-f archivo La expresión es cierta si es un archivo
-r archivo La expresión es cierta si es legible
-s archivo La expresión es cierta si el tamaño no es 0
-t desarchivo Es cierto si desarchivo es un descriptor del fichero asociado al terminal
-w archivo Es cierto si el fichero es modificable
-x archivo Es cierto si el fichero es ejecutable
-b archivo Es cierto si el fichero es un fichero de dispositivo de bloques
-c archivo Es cierto si el fichero es un fichero de dispositivo de carácter
-e archivo Es cierto si el fichero existe
-L archivo Es cierto si el fichero es un enlace simbólico
Enteros:
int1 -eq int2 i1=i2
int1 -ge int2 i1>=i2
int1 -gl int2 i1>i2
int1 -le int2 i1<=i2
int1 -lt int2 i1<i2
int1 -ne int2 i1!=i2
| Código: |
if [ $num1 -eq $num2 ]
then
echo "Los numeros son iguales"
fi |
Cadenas:
cad Es verdadero si la cadena no es vacía
cad1=cad2 Es verdadero si las cadenas son iguales
cad1!=cad2 Es verdadero si las cadenas son diferentes
-n cad Es verdadero si la longitud de la cadena no es 0
-z cad Es verdadero si la longitud de la cadena es 0
| Código: |
if [ -z $cadena ]
then
echo "La cadena no contiene ningun caracter"
fi |
OPERADORES LÓGICOS
! -> not !expresión1
-a -> AND expresión1 -a expresión2
-o -> OR expresión1 -o expresión2
PROCESAMIENTO DE DATOS NUMÉRICOS
let b=7
let a=2
let a=$b
let a=$a+5
OPERACIONES ARITMÉTICAS
+ - SIGNO OPERACIÓN
<< >>
!~ NOT, COMPLEMENTO A 1
== !=
** EXPONENCIACIÓN
<= =><>
* MULTIPLICACIÓN
/ DIVISIÓN
% RESTO
+- SUMA RESTA
&-> AND
^ XOR
| OR
&& AND LÓGICO
|| OR LÓGICO
= += -= *= /= %= &= ^= |=
a+=2 <--> a=$a+2
USOS DE EXPR
expr argumentos
expr arg1:arg2 --> Devuelve la parte que coinciden de ambas expresiones.
expr substr cadena principio longitud --> Extrae una subcadena desde donde se indique y con la logitud indicada
expr index cadena lista-caracteres --> Se le indica un carácter y devuelve la posición de la primera vez que lo encuentra.
expr length cadena --> Devuelve la longitud de la cadena.
ARRAYS
Declaración
| Código: |
declare -a nombre_array
read only –a nombre_array
nombre_lista [subindice]=valor ----> alumnos[7]=”Corento”
local -a nombre_array |
Acceso elementos del array
$nombre[subindice]
a=$alumnos[7] -->Solo devuelve una posición
a=$alumnos[@]-->Devuelve toda la lista
a=$alumnos[*]-->Devuelve toda la lista
Asignación
nombre_lista[posición]=valor
${#nombre_lista} -->Devuelve el tamaño de la lista en bytes
${#nombre_lista[posición]} -->Devuelve el tamaño del elemento
${#nombre_lista[*]} -->Devuelve el número de elementos de la lista
array[$i]=$variable --> La posicion de i la mete en la variable
echo "${array[$j]}" --> Muestra la posicion j del array por pantalla
ORDÉN EXEC Y ENTRADA/SALIDA DE ARCHIVOS
exec orden ----->exec------>orden
exec<archivo --> Desvía la entrada estándar al archivo. Todas las lecturas con la orden read se harán desde un fichero y no desde teclado
exec>archivo --> Todos los echos en vez de ir a la pantalla iran al fichero
exec>>archivo --> Desvía la salida estándar a un fichero
exec n <archivo --> Abre un fichero y le asigna el número descriptor que le indiquemos
exec n << archivo --> Igual que el cuartro pero para la salida
exec n << marcador
.........
datos
........
marcador
exec n >> archivo
exec n >&m --> Duplica todas las salidas del fichero n y también pasa al fichero.
exec <&- --> Cierre de la entrada estándar
exec >&- Cierre de la salida estándar
exec n<&- Cierre de la entrada con el descriptor que le indiquemos
exec n>&- Cierre de la salida con el descriptor que le indiquemos
Scripts de ejemplo hechos por mi para que la gente k empieza desde cero tenga un poco de idea.
| Código: |
#Script que muestra un menú con las siguientes opciones.
# 1 Montar un diskette.
# 2 Asignación IP a tarjeta de red. Se pedirá la tarjeta y la ip a asignar a la misma.
# 3 Puerta de enlace.
# 4.Activar enrutamiento.
# 5.- Ajuste de dns.
# 6. Fin.
#!/bin/bash
echo "1-Montar diskette"
echo "2-Asignar IP"
echo "3-Puerta de enlace"
echo "4-Activar enrrutamiento"
echo "5-Ajuste DNS"
echo "6-FIN"
read -p "Introduzca la opcion " op
case $op in
1)mount -t ext2 /dev/fd0 /mnt/diskette
;;
2)read -p "Introduzca el interfaz " interfaz
read -p "Introduzca la ip " ip
ifconfig $interfaz $ip
;;
3)read -p "Introduzca la puerta de enlace " gateway
route add default gw $gateway
;;
4)echo -n "1">/proc/sys/net/ipv4/ip_forward
;;
5)read -p "Introduzca la dns primaria " dns1
read -p "Introduzca la dns secundaria " dns2
echo "$dns1">>/etc/resolv.conf
echo "$dns2">>/etc/resolv.conf
;;
6)exit 0
;;
esac |
| Código: |
#Script que dice si un numero es par o impar.
#/bin/bash
read -p "Introduzca un numero " numero
resto=numero%2
if [ $resto -eq 0 ]
then
echo "El numero es par"
else
echo "El numero es impar"
fi |
| Código: |
#MINI_AGENDA que guarda los datos en un fichero de texto.
#/bin/bash
while [ $con!='N' ]
do
echo "1-Dar de alta a una persona"
echo "2-Eliminar una persona"
echo "3-Buscar una persona"
echo "4-Listar agenda completa"
echo "5-Ordenar agenda alfabeticamente"
echo "6-Salir"
read -p "Introduzca una opción" op
case $op in
1)read -p "Introduzca el nombre " nombre
read -p "Introduce el apellido " apellido
read -p "Introduce el sobrenombre " nick
read -p "Introduce el telefono " telefono
read -p "Fecha de nacimiento(con el formato dd/mm/aa) " fecha
echo -n "$nombre:$apellido:$nick:$telefono:$fecha">>agenda.txt
;;
2)read -p "Introduzca el nombre a borrar " nombre
cat agenda.txt|grep -v $nombre>>aux.txt
mv aux.txt agenda.txt
;;
3)read -p "Introduzca el sobrenombre a buscar " nick
cat agenda.txt|grep $nombre
;;
4)cat agenda.txt
;;
5)cat agenda.txt|sort >>aux.txt
mv aux.txt agenda.txt
;;
6)exit 0
;;
esac
read -p "¿Desea continuar S/N? " con
done |
| Código: |
#Script que convierte un fichero a mayúsculas o mínusculas segun el parámetro 2. El parámetro 1 será el nombre del fichero.
#!/bin/bash
if [ !-z $1 ] then
if [ ! -z $2 ] then
if [ $2 -eq 1 ] then
echo "Convirtiendo fichero a minusculas"
cat $1|tr [A-Z] [a-z]>aux.txt
mv aux.txt $1
fi
if [ $2 -eq 2 ] then
echo "Convirtiendo fichero a mayusculas "
cat $1 |tr [a-z] [A-Z]>aux.txt
mv aux.txt $1
fi
fi
fi
|
| Código: |
#Script que al introducir nombre de un programa lo elimina de memoria.
#!/bin/bash
read -p "Introduce el nombre del programa a eliminar de memoria " programa
ps -A |grep $programa |cut -f2 -d' '>/tmp/aux
exec < /tmp/aux #Hace k todos los read a partir de ahora lea de este fichero
read proceso #Lee la primera linea del fichero /tmp/aux
while [ $proceso ] #Mientras haya procesos en el fichero /tmp/aux se ejecuta el while
do
kill -9 $proceso
read proceso
done
exec>&_ |
Este es un pequeño manual para comenzar a programar en bash, distribuidlo, copiadlo, modificadlo. xDD
Si el moderador encuentra errores o quiere modificar algo k lo haga sin problemas.
Saludos
Ultima edición por kolombino el Lun May 26, 2008 10:49 am; editado 3 veces |
|
| Volver arriba |
|
 |
perezd Yo soy el foro


Registrado: 31 Ene 2007
Mensajes: 2184
Ubicación: Tercer Mundo, Uruguay
|
Publicado: Lun May 26, 2008 1:57 am Título del mensaje: |
|
|
Opa! Exelente trabajito amigo!
Personalmente tambien me sirvio, ya que programo ShellScripts tambien...
Un saludos y continua aportando a la Comunidad Linuxera de este foro... _________________ "El Software es Como el Sexo, Cuando es Gratis, Mejor"
Tutoriales, Guias, Problemas y Dudas sobre GNU/Linux - Foro Linux
|
|
| Volver arriba |
|
 |
|
|
|