Bash Básico - Userlinux.net

Blog sobre sistemas operativos, Linux, Wireless, BSD, Open Source, Software Libre, Mac OS X, Apple... y otras tech

Bash Básico

Conectividad con Google

Para comprobar la conectividad en bash podemos hacer lo siguiente:

#!/bin/sh
# Respuesta $? (0 si todo es OK)
PEPE=`ping -c 1 google.es`
echo $?

Si añadimos una redirección a /dev/null y 2>&1 para que los errores stderr (2) vayan al mismo sitio que la stdout (1) estaría más completo:

#!/bin/sh
PEPE=`ping -c 1 google.es`
echo $?

PEPA=`ping -c 1 loro.yar > /dev/null 2>&1`
echo $?

Obtener IP actual

#!/bin/sh
# Obtener la ip actual 
IP_ARA=`/sbin/ifconfig eth0 | grep 'inet ' | awk -F '[ :]+' '{print $4}'`
echo $IP_ARA

Buscar paquete a través de APT

#!/bin/sh
# Buscar un paquete apt (mysearch.sh)
if [ "$1" == "" ] ; then
    echo "Has de especificar un paquete..."
    exit
fi
apt-cache search $1 | grep $1

Sincronizar con un ntpd

#!/bin/sh
# Sincroniza con un ntp (myntp.sh)
rdate -s ntp.escomposlinux.org

Conectar por ssh

#!/bin/sh
# Conecta a una máquina por ssh (myssh.sh)
if [ "$#" -eq "2" ]; then
 ssh $1@$2
else
 echo "Debes especificar nombre y usuario"
fi

Galería de imágenes (thumb)

#!/bin/sh
# Crear una galería de mini imágenes (mythumb.sh)
 
for i in `ls *.jpg`;
do
	convert -geometry 320x240 $i galleria-$i
done

Renombrado de mayúsculas a minúsculas

#!/bin/sh
# Renombrar de mayúscula a minúscula un patrón pasado por argumento (mylowercase.sh)
for i in `ls $1`; do mv $i $(echo $i | tr [A-Z] [a-z]); done

Búsqueda de archivos por extensión

#!/bin/bash
# Buscar archivos de cierta extensión pasada por parámetro (myfind.sh)
find / -name *.$1

Renombrado masivo de extensiones

#!/bin/bash
# Renombra todos los archivos extensión $1 a extensión $2
if [ "$#" -eq "2" ]; then
 for f in *.$1; do mv $f `basename $f .$1`.$2; done;
else
 echo "Debes especificar dos extensiones"
fi

Saludo a todos los usuarios conectados

#!/bin/bash
# Manda un saludo a todos los usuarios *conectados* pasados por parámetro
for i in $*; do
        if who | grep "^$i" > /dev/null; then
                write $i << EoT
Hola $i!
EoT
        fi
done

Datos de grupos de un usuario

Escribir un programa usugrup que dado un nombre de login de usuario determine si existe en el sistema, y si es así, presente su nombre de usuario, , número de usuario (UID), grupo primario y grupos secundarios si los tiene, con leyendas adecuadas.

#!/bin/bash
# usugrup: datos y grupos de un usuario
#
USUARIO=$1
id $USUARIO 1>/dev/null 2>&1
ERROR=$?
if [ $ERROR -ne 0 ]
then
  echo "El usuario " $USUARIO "no existe"
  exit
fi
NOMBRE=`id $USUARIO | cut -f1 -d" "`
echo \(UID\) y nombre: $NOMBRE
GRUPO1=`id $USUARIO | cut -f2 -d" "`
echo \(GID\) y grupo primario: $GRUPO1
if test `id $USUARIO | tr " " "\n" | wc -l` -gt 2
then
  GRUPOS2=`id $USUARIO | cut -f3 -d" "`
echo \(GIDs\) y grupos secundarios: $GRUPOS2
fi

Buscar un patrón dentro de un archivo

Buscar un patrón dentro de un fichero de texto:

#!/bin/bash
 
if [ $# -ne 2 ]; then
        echo "Necesito dos argumentos, el primero"
        echo "es el fichero donde debo buscar y"
        echo "el segundo es lo que quieres que"
        echo "busque."
        echo " "
        echo "Uso: $0 <fichero> <patron_busqueda>"
        echo " "
 
        exit
fi
 
FICHERO=$1
BUSQUEDA=$2
 
if [ ! -e $FICHERO ]; then
        echo "El fichero no existe"
 
        exit
fi
 
NUM_VECES=`cat "$FICHERO" | grep --count "$BUSQUEDA"`
 
if [ $NUM_VECES -eq 0 ]; then
        echo "El patron de busqueda \"$BUSQUEDA\" no fue encontrado"
        echo "en el fichero $FICHERO "
else
        echo "El patron de busqueda \"$BUSQUEDA\" fue encontrado"
        echo "en el fichero $FICHERO $NUM_VECES veces"
fi

Ejemplo de case

Ejemplo de uso de case:

#!/bin/bash
# case_arg.sh
 
if [ $# -lt 1 ]; then
        echo "Error. Esperaba al menos un parametro"
        exit 1
fi
 
case $1 in
        --opcion1)
        echo "--opcion1 es una opcion reconocida"
        exit 0
        ;;
        --opcion2)
        echo "--opcion2 es una opcion posible"
	exit 0
        ;;
        linux)
        echo "\"linux\" es un argumento reconocido"
	exit 0
        ;;
        *)
        echo "Parametro no reconocido"
        exit 1
        ;;
esac

Ejemplo de while

Ejemplo uso while:

#!/bin/bash
 
j=0
 
while [ $j -lt 10 ]; do
	echo "j vale $j"
	j=$[$j+1]
done

Juego de adivinar número

Mítico juego del número usando if/elif:

#!/bin/bash
 
MINUM=8
 
while [ 1 ]; do
	echo "Introduzca un número: "
	read USER_NUM
 
	if [ $USER_NUM -lt $MINUM ]; then
		echo "El número intrododucido es menor que el mío"
		echo " "
	elif [ $USER_NUM -gt $MINUM ]; then
		echo "El número introducido es mayor que el mío"
		echo " "
	elif [ $USER_NUM -eq $MINUM ]; then
		echo "Acertaste: Mi número era $MINUM"
		break
	fi
done

Ejemplo de funciones()

Ejemplo de funciones:

#!/bin/bash
 
# function1.sh
 
function uso () {
	echo "Este script recibe dos argumentos."
	echo "El primero debe ser --opc1 u --opc2 ,"
	echo "y el segundo debe ser un fichero existente."
	echo "--"
}
 
if [ $# -ne 2 ]; then
	uso
	exit 1
fi
 
case $1 in
	--opc1)
		if [ -e $2 ]; then
			echo "El script terminó con éxito"
			exit 0
		else
			uso
			exit 1
		fi
	;;
 
	--opc2)
		if [ -e $2 ]; then
			echo "El script terminó con éxito"
			exit 0
		else
			uso
			exit 1
		fi
	;;
 
	*)
		uso
		exit 1
	;;
esac

Ejemplo de búsqueda avanzada

Hacer un guion de shell que muestre todos los ficheros del directorio $2 que contengan la palagra que se le pase como argumento $1:

#!/bin/bash
 
# $1 patron
# $2 directorio en el que buscar
 
echo -e "******* busca.sh *******"
 
grep -r $1 $2* | cut -f1 -d: | sort -u
tot=`grep -r $1 $2* | cut -f1 -d: | sort -u | wc -l`
 
echo -e "************************"
echo -e " $tot ocurrencias encontradas"
echo -e "******* busca.sh *******"

Información del sistema

********** Información Vital ********** 
Hostname: rwork
IPs:
192.168.1.7
127.0.0.1
 
Kernel: 2.6.17-11-generic
Distribución: testing/unstable
Uptime: 18:39:34 up  9:09
Usuarios conectados: 12 users
Carga del procesador:load average: 0.41, 0.23, 0.21
 
********** Hardware ********** 
Modelo de procesador: Intel(R) Pentium(R) 4 CPU 2.80GHz
Velocidad CPU: 2814.081
Bogomips: 5633.32
Memoria actual:
             total       used       free     shared    buffers     cached
Mem:        516608      88712     427896          0      12196      47616
 
 
********** Dispositivos PCI ********** 
00:00.0 Host bridge: Intel Corporation 82865G/PE/P DRAM Controller/Host-Hub Interface (rev 02)
00:01.0 PCI bridge: Intel Corporation 82865G/PE/P PCI to AGP Controller (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 (rev 02)
00:1d.3 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2)
00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge (rev 02)
00:1f.1 IDE interface: Intel Corporation 82801EB/ER (ICH5/ICH5R) IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801EB/ER (ICH5/ICH5R) SMBus Controller (rev 02)
00:1f.5 Multimedia audio controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) AC97 Audio Controller (rev 02)
01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 PF/PRO AGP 4x TMDS
02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
02:09.0 Ethernet controller: Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller (rev 13)
 
********** Esquema de particionado ********** 
S.ficheros            Tamaño Usado  Disp Uso% Montado en
/dev/hda1              27G  4,6G   22G  18% /
varrun                252M   92K  252M   1% /var/run
varlock               252M     0  252M   0% /var/lock
procbususb             10M  108K  9,9M   2% /proc/bus/usb
udev                   10M  108K  9,9M   2% /dev
devshm                252M     0  252M   0% /dev/shm
lrm                   252M   18M  235M   7% /lib/modules/2.6.17-11-generic/volatile
 
********** Puntos de montaje ********** 
/dev/hda1 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
/sys on /sys type sysfs (rw,noexec,nosuid,nodev)
varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755)
varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
devshm on /dev/shm type tmpfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
lrm on /lib/modules/2.6.17-11-generic/volatile type tmpfs (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

Webthumb firefox

Script que abre una conexión con un vnc local, arranca mozilla-firefox con una página específica (terra.es en este ejemplo) y saca un screenshot:

#!/bin/bash
vncserver -geometry 800x800 -depth 24
sleep 5
DISPLAY=:1 mozilla-firefox -P "Default User" &
sleep 5
DISPLAY=:1 mozilla-firefox -remote "openurl(http://www.terra.es)"
sleep 5
DISPLAY=:1 import -window root -resize 200x200 /root/myshot.jpg
vncserver -kill :1

Webthumb VNC

This code is from Chimeric, here is the original. That's only a copy&paste because it gives me many ideas:

All it takes is ImageMagick, Firefox the Firefox Fullscreen extension tied together with a little bash script1). The Fullscreen Firefox extension can be configured to hide the tabs/scrollbars when switching Firefox into fullscreen mode via F11. That comes in real handy because you don't have to worry about how to remove these things from the screenshot later. Here's the script.

#!/bin/sh
# @author Michael Klier <chi@chimeric.de>
#
# small script to create a series of website screenshots
 
DATE=$(date -I)
FX_BIN=/opt/mozilla/bin/firefox
IMM_BIN=/usr/bin/import
 
if [ -f $1 ]; then
    URLS=$(cat $1)
else
    URLS=$1
fi
 
mkdir ${DATE} && cd ${DATE}
 
CNT=1
for URL in $URLS; do
    if [ ! -n "$2" ]; then
        PREFIX=${DATE}
    else
        PREFIX=${DATE}-${2}
    fi
 
    if [ $CNT -lt 10 ]; then
        FNAME=${PREFIX}-0${CNT}.jpg
    else
        FNAME=${PREFIX}-${CNT}.jpg
    fi
 
    $FX_BIN $URL && sleep 5
    $IMM_BIN -window root -display :0 -resize 1024 $FNAME
    CNT=$((CNT+1))
done