Programación del Shell Argumentos: $cmd arg1 arg2 arg3 ($0 $1 $2 $3) read var1 [var2] (Se lee texto tecleado desde la terminal) $cat dame-tu-nombre echo “Cual es tu nombre:\c” read nombre echo Hola, $nombre Códigos de retorno Todos los comandos en Unix generan códigos de retorno, el código de retorno 0 indica "verdadero", si el código es diferente de 0 indica falso. $? guarda el código de retorno del comando más reciente # grep user7 /etc/passwd user7:WDUwYCI,M0j8:604:3:1835:/j1/gp0/user7: #echo$? 0 Comando test args, [ args ] args forma una expresión lógica, se evalúan los argumentos y se fija el valor de $?. Se pueden evaluar condiciones de archivos, variables y números r w x f d c b s z var n var var1 = var2 var1!= var2 var1 archivo verdadero si el archivo existe y se puede leer verdadero si el archivo existe y se pude escribir archivo verdadero si el archivo existe y se puede ejecutar archivo verdadero si el archivo existe y es regular archivo verdadero si el archivo existe y es un directorio archivo verdadero si el archivo existe y es tipo caracter archivo verdadero si el archivo existe y es tipo bloque archivo verdadero si el archivo existe y su tamaño es mayor que cero archivo verdadero si la longitud de la variable var es cero verdadero si la longitud de la vaiable var es diferente de cero verdaderos si sus contenidos son iguales verdadero si sus contenidos son diferentes Verdadero si var1 no es un caracter nulo (retorno) n1 –eq n2 Combinación con operadores ! -a -o \( expr \) verdadero si los enteros n1 y n2 son algebraicamente iguales otras comparaciones con enteros: -ne –gt – lt –le Negación Operador AND Operador OR Agrupación Ejemplo: ARCH=$1 if [ -s $ARCH -a -r $ARCH ] then echo $ARCH es ">0" y se puede leer else if [ ! -r $ARCH ] then echo $ARCH no se puede leer fi fi Comando if if cmd1 cmd 2 then cmd 3 cmd 4 fi if grep $1 /etc/passwd >/dev/null then echo $1 se encontró exit 0 else echo $1 no se encontró exit 1 fi if grep $1 /etc/passwd >/dev/null then if grep $2 /etc/passwd>/dev/null then echo $1 y $2 estan aqui else echo solo $1 esta aqui fi else if grep $2 /etc/passwd>/dev/null then echo solo $2 esta aqui else echo ninguno esta aqui fi fi Comando while while cmd1 do cmdA cmdB done Ejecuta cmd1, si el código de retorno es 0, ejecuta los siguientes comandos while true do date | tee -a crece ls -l crece ps echo sleep 10 done break [arg] -> La ejecución prosigue después de encontrar arg veces la palabra done continue [ arg ] -> Provoca que la ejecución salte al principio del ciclo arg exterior Construcción for for var in lista do cmd1 cmd2 . cmdN done Asigna el primer valor en lista a "var", ejecuta todos los comandos entre "do" y "done", continúa asignando y ejecutando hasta que todos los valores en lista se hayan asignado a "var" for i in 1 2 3 4 5 6 7 8 do cp examen ../user$1/examen chmod +x ../user$1/examen done Otra forma sería ( for i in $* ) Construcción case case word in patron1) cmd . . ;; patron2) cmd . ;; patronN) cmd ;; esac Ejemplo: hoy=`date +%m%d` case $hoy in 1111) echo "hoy es el once de noviembre" ;; 0511)echo "hoy no es 1111" ;; *)echo "hoy no es importante" ;; esac exit arg: Termina la ejecución de un procedimiento shell, asigna un valor al código de retorno. break [ arg ] La ejecución prosigue después de encontrar arg veces la palabra done continue [ arg ] La ejecución salta al principio del ciclo arg exterior expr se usa para realizar operaciones aritméticas en el shell $ expr 5+20, 26 $cat expr.test j=1 while test $j -le 10 do echo $j j=`expr $j + 1` done Los programas que se realicen deben estar en un directorio llamado "ejercicios", bajo el directorio hogar de su cuenta. 1) Cambiar el prompt de su cuenta desde el archivo .profile, se deberá desplegar el nombre de la máquina y su directorio hogar. 2) Escribir un programa de shell que se llame "copiax". Cuando se ejecute debe preguntar por un nombre de archivo, hará una copia de este archivo pero con la terminación "X". 3) Escribir un programa que ponga el nombre del usuario en pantalla. El programa hará tres preguntas. La primera debe preguntar el nombre y desplegarlo, la segunda y tercera preguntas pedirán el apellido paterno y materno finalmente se desplegará todo el nombre en una sola línea. 4) Realizar un programa en shell que utilice redirecciones ( e.g. >, >>, <, <<) para crear un archivo que contenga la siguiente información: Fecha de hoy Directorio de trabajo Lista de quiénes están en el sistema 5) Escribir un programa que simule el comando "cp". (utilizando "cat"), deberá pedir el nombre del archivo original y el nombre del archivo donde copiará el contenido. 6) Hacer un programa que ordene las cuentas del archivo "etc/passwd", el programa deberá preguntar si el ordenamiento se hará por nombre de usuario o número de usuario. La salida se dará en un archivo que se llame cuentasord. 7) Escribir un programa llamado "rmarch" el cual preguntará al usuario un nombre de archivo repetidamente. Si el usuario responde con un <retorno>, el programa termina (usar el comando break). si el usuario responde con un nombre de archivo, y el archivo existe, "rmarch" desplegará el número de caracteres en el archivo y preguntará al usuario si el archivo debería borrarse. Si el aro no existe, el programa responderá con un mensaje que lo indique y preguntará por el siguiente nombre de archivo. Usar el comando continúe para lograr esto. Si el usuario responde con una "s" o "S", el programa borrará el archivo. Si el usuario responde con cualquier otra cosa, el programa no borrará el archivo y preguntará el nombre del siguiente archivo. 8) Escribir un programa en shell llamado "menu5>", que acepte un solo argumento, el cual debe ser un número entre 1 y 5. Debe imprimir un mensaje diferente en respuesta a cada número, se deberá imprimir un mensaje de error si el número no se encuentra en el rango anterior.