Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bash Scripting PDF
Bash Scripting PDF
scripts Bash
• Presenta el prompt
#!/bin/bash
comando1
comando2 \
comando_2_continúa
#podemos partir líneas con \
comando3;comando4
#los comandos se separan por fin de línea, o por ;
Variables y parámetros
✔ Reglas típicas: no comenzar por dígitos, no carácteres especiales, etc.
#!/bin/bash
variable=2
variable=$variable + 1
b=$variable
Reglas de sustitución de variables
echo “${hello}” #A B C
✔ Tipos de asignación
#!/bin/bash
# alta_usuario.sh
vble2=””
\n Nueva línea
\r Retorno de carro
\t Tabulación
\v Tabulación vertical
\b Espacio
\a Alerta (beep)
\0xx octal ASCII equivalente a 0xx
ls -l 2> ls_errores
ls -l 2>> ls_errores
✔ Redireccionamiento de entrada y salida estándar
✔ Utilidades:
comando &> file #Redirige stderr y stdout
: > file #Crea un fichero vacío
: >> file #Crea un fichero vacío, o no hace nada si ya existe
Si se quiere vaciar un fichero, este método es el más eficiente (similar a touch si el
fichero no existe)
FILE=alums.asc
LOGIN=`echo "$NAME" | cut -c 1``echo "$APES" | cut -f1 -d" " `$FNAC
Exit y Exit Status
✔ exit: comando para terminar el script. Puede devolver un valor que será
entregadoa su script padre
echo hello
echo $? #Exit status 0
lalala
echo $? #devolverá no-cero, porque el comando no existe
condicionales: test, [], if/then
Operadores que evalúan la condición y devuelven 0 para true, y 1 para false
✔ test <condicional>
• Desde la linea de comandos se ejecuta /usr/bin/test, extensión de bash
• Desde un script es parte de sh-utils (no llama al binario anterior)
✔ [ <condicional>
• El corchete izquierdo es sinónimo de test, pero más eficiente.
• No tiene por qué cerrarse con ], pero generalmente ello incurre a error
por otras circunstancias ajenas al comando.
✔ [[ <condicional> ]]
• Método diferente de comparación, más intuitivo y parecido a los
lenguajes típicos. Más versátil y completo. Adaptado de ksh88
if/then
✔ Se suele combinar con alguno de las tres opciones anteriores para ejecutar
comandosen caso de que la comparación sea true o false
✔ if/then también puede usarse con comandos directamente. En este caso más
que evaluar, simplemente devuelve su código de error.
Alternativa: (( condicion ))
#!/bin/bash
(( 4 > 2 ))
echo $? Devuelve 0, true
Operadores para testear ficheros
if [ -op ruta_del_fichero ]
✔ Opción 2:
if [ exp1 ] && [ exp2 ] AND lógico
if [ exp1 ] || [ exp2 ] OR lógico
Constantes
let “decimal = 32”
let “octal = 032”
let “hexadecimal = 0x32”
let “binario = 2#1111001101”
let “base32 = 32#77”
Variables de entorno y especiales
✔ Al iniciar la shell, como todo proceso, se crea un entorno de variables.
✔ Se pueden cambiar con export, pero solo afectará a los procesos hijos
Algunas variables de entorno
$BASH Path del bash binario
$BASH_SUBSHELL Nivel de subshell
$EDITOR Editor por defecto
$FUNCNAME Nombre de la funciñon actual
$GROUPS Grupos del usuario actual
$HOME Home del usuario actual
$HOSTNAME
$PATH Ruta de binarios
$PWD Directorio actual
$OLDPWD Antiguo directorio
$SECONDS El número de segundos que lleva el script corriendo
$P1 Prompt principal
$P2 Prompt secundario
$PPID PID del proceso padre
$TMOUT Si no es cero, se hará logout tras ese número de segundos
$UID ID del usuario actual (el de root es cero)
Según la distribución y versión, algunas de estas variables pudieran no estar
definidas.
Algunas variables especiales
$! PID del último proceso corriendo en background
$_ Último argumento del previo comando ejecutado
$$ Pid del propio script actual
$*,$@,$1,$2, ${12}
Manipulación de cadenas
Multitud de diversas opciones para manipular cadenas
a=letra
letra=z
eval a=\$$a
echo $a #Devuelve z
for
for arg in <lista>
do
...
done
✔ Alternativas
for a in 1 2 3 4 5 6 7 8 9 10
for a in `1 step 10`
for ((a=1; a <= 10 ; a++)) #construcción similar a C
Ejemplo: En todos homes de los profesores hay que copiar el archivo /
usr/share/instituto/monitorprofe y llamarlo .monitorprofe. Si ya existe se
mantendrá, pero hay que asegurarse que la línea que define RetardoGH
sea RetardoGH=12
#!/bin/sh
archivo=/usr/share/instituto/monitorprofe
if [ ! -f /home/profesor/$i/.monitorprofe ]; then
cp -f $archivo /home/profesor/$i/.monitorprofe
else
grep -v Retardo /home/profesor/$i/.monitorprofe > /tmp/tmpkk
echo 'RetardoGH="12"' >> /tmp/tmpkk
mv /tmp/tmpkk /home/profesor/$i/.monitorprofe
fi
chown $i:profesor /home/profesor/$i/.monitorprofe
done
while
while <condición>
do
...
done
until
until <condición>
do
...
done
Mientras la condición sea falsa, se ejecuta el bloque
break y continue
for i in 1 2 3 4 5 6 7 8 9 10; do
if [ “$i” -eq 4 ]; then
continue 2
fi
echo -n “$i “
done
#Salida con continue 2: 1 2 3 2 3 2 3 2 3...
#Salida con continue: 1 2 3 5 6 7 8 9 10
case
case “$variable” in
“$condicion1”) ...
;;
“$condicion2”) ...
;;
* ) ...
;;
esac
ejemplo de case
Script que acepta parámetros tipo: script.sh --h --conf archivo
while [ $# -gt 0 ]; do
case “$1” in
-h|--help)
echo “Mostrar ayuda”
;;
-c|--conf)
CONF_FILE=$2
shift
;;
-d|--debug)
DEBUG=1
;;
*) echo “Parámetro no reconocido”;;
esac
shift
done
select
select variable [in list]
do
....
break
done
✔ Las variables locales tienen que ser declaradas con “local”. En caso
contrario son “vistas” desde fuera de la función (si la función ya se ha
ejecutado)
func () {
vble=37
}
echo “$vble” #No se imprime nada
func
echo “$vble” #imprime 37. Si fuera local no imprimiría nada
✔ Se admite la recursión
ALIAS
✔ Son simples abreviaturas para acortar comandos.
✔ Común encontrarse algunos en el script ~/.bashrc
• Ejemplos de error
a=37
if [$a -gt 27 ]; then #Produce: [37 command not found
echo $a
fi
exit 0
##/root/utils/debecho.sh (debug-echo)
##Hará echo del parámetro pasado, si se ha definido la variable DEBUG
debecho () {
if [ -z “$DEBUG” ]; then
echo “$1” >&2 #canal de errores
fi
}
B - En el sha-bang:
#!/bin/bash -x
I/O
echo
printf
read
Filesystem
cd
pwd
pushd, popd (a modo de pila-bookmark de directorios)
dirs (lista el contenido de la pila anterior)
variables
let <operacion_aritmética>
eval <condición_lógica>
set <asignación>
unset
export
declare, typeset, readonly
getopts (manejar argumentos de forma avanzada)
scripts
., source (Similar a #include en C)
exit
exec (ejecuta sin fork, pero fuerza un exit al acabar)
commands
true
false
control de tareas
jobs (lista las tareas ejecutándose en background y sus
identificadores, NO es tan útil como ps)
disown (Elimina una tarea)
kill (fuerza la eliminación)
fg, bg (manda una tarea a primer o segundo plano)
wait
supend (similar a control-Z)
logout
Comandos externos
Típicos
man,ls,cat
tac invierte el orden de los caracteres
rev invierte el orden de las lineas
cp,mv,rm copiar, mover, borrar ficheros o directorios
Muy común cp -f y rm -f para evitar confirmación en scripts
rmdir,mkdir borrar y crear directoriso vacíos
mkdir -p /a/b/c crea toda la ruta si no existe (p de parents)
chmod cambia permisos
chattr cambia atributos. Especialmente importante
chattr +i fichero
Hace al fichero inmutable: no puede modificarse, linkearse, borrarse, ni si quiera
por root. Este mecanismo es usado actualmente con gnome.conf para que no se
pueda hacer loguin gráfico en un equipo ni aún sabiendo la clave de root.
La solución es entrar por ssh y hacerle chattr -i
ln -s
Comandos más complejos
find
xargs
expr
Hora y Fecha
date
zdump
time
touch
at
batch
cal
sleep
usleep
hwclock, clock
Procesado de Texto
sort
tsort
uniq
cut
paste
join
head
tail
grep
look
sed
awk
wc
tr
fold
fmt
col
column
colrm
nl
...
comandos de fichero
tar
gzip
bzip2
cpio
file
which
whereis
whatis
locate, slocate
diff
cmp
basename
dirname
sum, cksum, md5sum
crypt
more, less
redes
host
traceroute
ping
whois
finger
vrfy
acceso remoto
ftp
telnet
wget
lynx
rlogin
rsh, ssh
rcp, scp
rsync
mail
Misceláneo
clear
factor
bc
dc
jot, seq
banner
lp
tee
dd
units
dialog
Comandos de Administración
✔ Usualmente son lanzados por root (Ejemplos en /etc/rc.d/ )
#GRUPO
if ! grep $GRUP /etc/group > kk; then
groupadd $GRUP
mkdir -p /home/aulas/$GRUP
chown -R root:$GRUP /home/aulas/$GRUP
chmod 775 /home/aulas/$GRUP
fi
#USUARIO
if [ ! -d /home/alumnos/$USER ]; then
echo -n "Creando $USER en grupo $GRUP ..."
E_PASS=`mkpasswd -S "GV" $PASS`
./alta_usuario.sh $USER $E_PASS alumnos
usermod -G $GRUP,alumnos -c "$NAME $APES" $USER
setquota $USER $ALUM_QUOTA $ALUM_QUOTA 0 0 /home
TERMINALES
tty Muestra la ruta del terminal actual
mesg Activa/desactiva la recepción de mensajes al terminal actual
wall Manda un mensaje al terminal de todos los usuariso logueados
dmesg Muestra todos los mensajes del sistema desde el arranque.
Útil combinarlo con grep para hallar dispositivos usb, etc.
dmesg -c #borra todos los mensajes tras mostrarlos
dmesg | grep USB
ESTADÍSTICAS E INFO
uname Muestra especificaciones de sistea oeprativo, núcleo, etc.
lastcomm Muestra información de comandos previos lanzados por usuarios
lastlog Muestro la fecha/hora del último loguin de cada usuario
lsof Lista ficheros abiertos
strace Herramienta para diagnosticar y depurar comandos
nmap Escáner de puertos de red
nmap 172.x.x.2 | grep ftp #21/tcp open ftp
free -m Muestra memoria y caché usada en megabytes
procinfo Extrae extensa información de /proc
lsdev lista los dispositivos
du Espacio de disco usado por archivos, directorios o discos
df Epacio usado por los sistemas de ficheros
stat Detalladas estadístics de un fichero
vmstat Estadístics de memoria virtual
netstat Información de la red
uptime tiempo que lleva el sistema corriendo
hostname nombre del host actual
hostname -s Dominio
LOGS
logger Añade el mensaje pasado a /var/log/messages
logrotate Utilidad para rotar, comprimir, borrar, etc todo lo referido a
/var/log. Configuracion en /etc/logrotate.conf
CONTROL DE TRABAJO
RED
ifconfig Configuración de red
iwconfig configuración de red inalámbrica
route Tabla de rutas del kernel (obtener la puerta de enlace)
chkconfig Chequea la configuración de red
tcpdump Sniffer de paquetes de red
SISTEMA DE FICHEROS
mount, umount Montar/desmontar un sistema de ficheros. /etc/fstab
sync Sincroniza posibles buffers con el dico duro. Útil ejecutarlo
para asegurarse que una copia de ficheros ha finalizado
mkswap Crea una partición swap o fichero swap
swapon, swapoff Activa/desativa un espacio swap
mke2fs ,mkntfs Crear sistemas de ficheros: ext2, ntfs
dump2fs Lista información del sistema de ficheros
hdparm Muestra o cambia parámetros del disco duro
fdisk gestor de particiones
fsck, e2fsck, debugfs Cheaquea, repara y deputa sistemas de ficheros
badblocks Busca sectores dañados en un dispositivo
mkboot Crea disco de arranque
chroot Cambia el directorio de root
mknod Crea archivos de dispositivos. Generalmente necesesario
cuando se añade nuevo hardware
mkntfs Crea sistema de ficheros ntfs
MAKEDEV Utilidad similar a mknod, más fácil de usar
tmpwach Borra ficheros no accedidos en un periodo de tiempo
BACKUP
dump, restore Crea y restaura copias de seguridad
#copia_servidor.sh 0
if [ $1 ]; then
dump $1'uf' /dev/nst0 /
dump $1'uf' /dev/nst0 /boot
dump $1'uf' /dev/nst0 /usr
dump $1'uf' /dev/nst0 /var
dump $1'uf' /dev/nst0 /home
if [ $1 = 4 ]; then
mt -f /dev/nst0 rewind
mt -f /dev/nst0 offline
fi
else
echo "se necesita un parámetro"
fi
MODULOS
gdb archivo_ejecutable
• Esto nos abrirá una sesión de debugger. A través de comandos como list,
run, print, podemos localizar la línea que genera el fallo en tiempo de
ejecución
Python
✔ Lenguaje GPL, orientado a objetos y de propósito general
✔ Multiplataforma, pero especialmente en Linux y Macs
✔ Muy usado en herramientas y en web por su sencillez