Josep Garcia

Bash

Menú de opciones interactivo en bash

Podemos modificar el comando read de un menú para que no sea necesario pulsar la tecla "ENTER" para elegir una opción.
read -n1 opcion (lee un carácter)

Ejemplo:

#!/bin/bash
clear
while :
do
	echo "Elige una opccion:"
	echo "1. Quien soy?"
	echo "2. Espacio en el disco duro"
	echo "3. Kernel en uso"
	echo "4. Salir"
	read -n1 opcion
	case $opcion in
		1) echo "Eres: ";
     		   whoami;
		   echo;;
		2) echo "Espacio en disco: ";
		   df -h;
		   echo ;;
		3) echo "Kernel: ";
		   uname -a;
		   echo;;
		4) echo "Bye!";
		   exit;;
		*) echo "Error: Elige una opcion valida [1-4]";
		   echo;
		   echo;;
	esac
done

Texto aleatorio en bash

Con este script podemos crear un texto aleatorio en bash, genera un texto tan largo como el número que le pasemos como parámetro, si no le pasamos nada el texto resultante será de 2 caracteres.

#!/bin/bash
function textoAleatorio () {
	LETRAS=( a b c d e f g h i j k l m n o p q r s t u v w x y z 
		 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z )
	TOTAL_LETRAS=${#LETRAS[*]} 
	y=0
	if [ $1 ]; then
		max=$1
	else
		max=2
	fi
	while [ $y -lt $max ]; do
	    x=$(($RANDOM%500)) 
    	    index=$(($RANDOM%$TOTAL_LETRAS)) 
	    echo -n ${LETRAS[$index]}
	    ((y++)) 
	done
}
textoAleatorio $1

Lo guardamos como aleatorio.sh y lo ejecutamos:
$ sh aleatorio.sh 5
lfEJe
$ sh aleatorio.sh 15
VJYFDkGcSDLvDei
$ sh aleatorio.sh 55
zMCnlrPDvTKxHOeiRTOxsXfSqIiUsoCuyPCrwtyRGXAhLmWbAhJgGgm
$ sh aleatorio.sh
xA

Bash Scripting, ejemplo con arrays

### fichero lenguajes.sh
#!/bin/bash
arr=( "espanyol#hola" "ingles#hello" "frances#bonjour")
len=${#arr[*]}
i=0
while [ $i -lt $len ]; do
lenguaje=$(echo ${arr[$i]} | cut -d"#" -f1 2>/dev/null)
if [ "$lenguaje" == "$1" ]; then
echo ${arr[$i]} | cut -d"#" -f2
fi
i=$(expr $i + 1)
done

$ sh lenguajes.sh espanyol
hola
$ sh lenguajes.sh ingles
hello

Parsear parámetros en bash

Queremos obtener todos los parámetros pasados a un script, las opciones disponibles serán "-a" y "-b":
Ejemplo: ./parsear.sh -a param1 param2 paramN -b param1 param2 paramN

Una opción es usar la función "getopts":

while getopts "a:b:" OPTION;
do
case $OPTION in
a)
echo "OPTION is a"
echo "parametros A= $OPTARG"
;;
b)
echo "OPTION is b"
echo "parametros B= $OPTARG"
;;
esac
done

Programación bash: error "let: not found"

A veces, al ejecutar un script en bash:
# sh script.sh
Obtenemos el siguiente error:
let: not found
Esto ocurre porque la shell que utilizamos no es la correcta, por defecto se usa dash y la orden "let" solo funciona con bash. (en dash podemos usar "expr" en vez de "let").
Al ejecutar el script de la siguiente forma funcionará perfectamente:
# bash script.sh

Podemos modificar el enlace a /bin/sh para que use por defecto "bash" (hay que hacerlo como root):

Bash Scripting I

Quitar espacio en blanco de una cadena de texto (o de los nombres de archivo):

$ echo "aa b ccc ddd eee" | sed -e "s/ //g"

Mostrar la primera palabra de cada línea de un fichero de texto:

#!/bin/sh
while read line
do
echo $line | cut -d" " -f1
done < texto.txt

Categorías

LinuxAndroidBash ScriptingDrupal

Twitter

Twitter Josep Carlet