Entrada y salida de datos, variables, estructuras de control, funciones

La entrada y salida de datos

Para  escribir en la salida estándar utilizamos el comando echo. Y para leer de la misma utilizamos el comando read.

echo Introduzca el nombre:

read NOMBRE

echo Introduzca el apellido:

read APELLIDO

NOM_COMPLETO =

NOM_COMPLETO=”$NOMBRE $APELLIDO”

echo Mi nombre completo es $NOM_COMPLETO

Operaciones aritméticas

La shell bash soporta operaciones aritméticas pero únicamente sobre números enteros. La siguiente operación: A = B + 10 puede realizarse de la siguiente manera,

Bourne shell A = `expr $B + 10`
Bash shell let A = “$B + 10”
Operaciones aritméticas entre paréntesis A = $(( B + 10 )
Con declaración de variables declare –i A

declare –i B

A = B + 10

Estructura de control if

Para evaluar condiciones podemos utilizar el comando test (se puede consultar la ayuda de linux para conocerlo con más detalle y ver las opciones).

De momento podemos ver que es equivalente :

if test condicion-verdadera       a      if [ condicion-verdadera ]

Por ejemplo, con la opción –z comprobamos que la longitud de una cadena sea 0.

Un uso muy común es comprobar si un script tiene argumentos de entrada :

if test –z “$1”

then

echo “No hay argumentos de entrada en la línea de comandos”

else

echo “El primer argumento de entrada es $1”

fi

if [ -z  “$1” ]

then

echo “No hay argumentos de entrada en la línea de comandos”

else

echo “El primer argumento de entrada es $1”

fi

Observad que en nuestra línea de comandos $0 es el nombre del comando; $1 el primer argumento, $2 el segundo argumento, etc. Y que para indicar que $1 es una cadena ponemos comillas dobles.

Hay que tener en cuenta que test tiene muchas opciones distintas según los argumentos de la comparación : para cadenas,ficheros,valores numéricos,etc.

La negación la indicamos con la admiración :

if !test –z “$*”          (si el comando tiene argumentos …..)

ó

if [! –z   “$*”]

Para evaluar varias condiciones utilizamos los símbolos && y || con corchetes dobles:

[[ condicion1 && condicion2 ]]            para la condición y

[[ condicion1 || condicion2 ]]               para la condición o

 con la variable test :

if test condicion1 –a condicion2         para la condición y

if test condicion1 –o condicion2         para la condición o

también podemos utilizar corchetes simples de la forma:

if [ condicion1 –a condicion2 ]                        para la condición y

if [ condicion1 –o condicion2 ]                        para la condición o

Estructura de control case

case $variable in

expression1)

command1;;

expression2)

command2;;

esac

loops

while condicion

do

comandos

done

until condicion

do

comandos

done

for variable in elemento1 elemento2 elemento3

do

comandos

done

Para el uso de la instrucción for podemos utilizar conjuntos de variables como por ejemplo :

 

for i in 1 2 3 4 5 6 7 8

do

ping -c1 DA$i

done

 En esta instrucción se están localizando con el comando ping las máquina de nombre DA1, DA2, DA3 … DA8

También es muy normal utilizar en el bucle del for el resultado de la ejecución de un comando que por ejemplo nos de un listado de ficheros utilizando las comillas simples :

for i in `ls`

do

echo $i

done

Con este ejemplo mostramos por pantalla los ficheros del listado.

functions

La sintáxis para el uso de funciones sería la siguiente :

functionname(){

comandos

}

Por ejemplo la función mcd crea un directorio y cambia al directorio correspondiente :

mcd () {

mkdir $1

cd $1

}

Para usarlo incluiríamos la siguiente línea en nuestro script :

mcd directorio

Otro ejemplo sencillo sería la función pausa:

pausa(){

echo “Para continuar, pulsa RETURN”

read q

}

Por ejemplo la función mcd crea un directorio y cambia al directorio correspondiente :

mcd () {

mkdir $1

cd $1

}

Para usarlo incluiríamos la siguiente línea en nuestro script :

mcd directorio

Otro ejemplo sencillo sería la función pausa :

pausa(){

echo “Para continuar,pulsa RETURN”

read q

}

En este ejemplo vamos a mostrar un menú que muestre distintas opciones para administrar cuentas de usuario:

declare -i RES

RES=1

while test $RES -ne 0

do

echo “Elija una opcion”

echo “[1] – Mostrar parametros por defecto para nueva cuenta de usuario”

echo “[2] – Crear nueva cuenta de usuario”

echo “[3] – Expirar cuenta de usuario”

echo “[4] – Mostrar el entorno del usuario”

echo “[0] – Salir”

    read RES

   case $RES in

1 )

#Parametros de /etc/login.defs

cat /etc/login.defs > temp

if test -e $temp

then

echo “`sed “/#/d” temp|sed -e “/^$/d”`”

else

echo “Error : el fichero login.defs no existe”

fi

;;

2 )

echo “Escriba el nombre de la nueva cuenta de usuario”

read CUENTA

if ! test -z “$CUENTA”

then

#Crea la cuenta con su directorio home

sudo useradd -m $CUENTA

else

“Error : debe introducir el nombre de la cuenta”

fi

;;

3 )

echo “Escriba el nombre de la cuenta de usuario”

read CUENTA

if !test -z “$CUENTA”

then

echo “Introduzca una fecha de expiracion de la cuenta $CUENTA [YYYY-MM-DD]”

read FECHA

sudo usermod -e $FECHA $CUENTA

fi

;;

4 )

echo “Escriba el nombre de la cuenta de usuario”

read CUENTA

# Desde el usuario root puedo acceder directamente a la cuenta del usuario

# No creo que sea aconsejable, pero funciona.

echo “El entorno de $CUENTA es”

sudo su – $CUENTA -c “env”

;;

0 )

echo “Fin de programa”

;;

* )

echo “Error : opción incorrecta”

;;

esac

done