Advertisement
Guest User

Pr3. de nada

a guest
Sep 19th, 2014
848
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 17.23 KB | None | 0 0
  1. Trabajo Práctico Nº 3
  2. Shell Scripting
  3.  
  4. 1.- ¿Qué es el Shell Scripting?
  5. Es un archivo con una secuencia de comandos de determinado Shell.
  6. ¿A qué tipos de tareas están orientados los script?
  7. La programación en shell-script es muy útil para resolver tareas repetitivas, típicas de los Administradores.
  8. ¿Los scripts deben compilarse? ¿Por qué?
  9. No. Son interpretados comando por comando cada vez que se ejecutan.
  10.  
  11. 2.- Investigar la funcionalidad de los comandos echo y read.
  12. echo:
  13. El comando echo se utiliza para mostrar cadenas de texto (strings) en la pantalla de la terminal.
  14. Parámetros
  15. echo cuenta con dos parámetros principales, -n y -e, siendo este último para usar distintos “saltos de línea“.
  16. -n> No hace un salto de línea al final de la cadena de texto.
  17. -e> Activa los distintos saltos de línea, estos saltos de linea están precedidos por la barra invertida (\).
  18. Distintos saltos de línea:
  19. \a –> Alambra (timbre).
  20. \b –> Espacio atrás.
  21. \c –> Suprime “salto de linea” final.
  22. \f –> Efectua un salto de página.
  23. \n –> Efectua un salto de línea.
  24. \r –> Retorno de carro.
  25. \t –> Hace un tabulado horizontal.
  26. \v –> Hace un tabulado vertical.
  27. \\ –> Barra invertida.
  28. \nnn –> Escribe el caracter ASCII cuya codigo es “nnn” (escrito en octal).
  29. Sintaxis del comando echo:
  30. echo [-n][-e | parámetros]
  31. read:
  32. Lee una línea de la entrada estándar y asigna las palabras de la línea a las variables indicadas, si el número de palabras es mayor que el número de variables se asigna a la última variable las palabras sobrantes. Si es a la inversa se restaura el valor de las variables no asignadas.
  33. read -e inserta toda la línea en la primer variable
  34. read -p frase muestra frase si se lee de un terminal
  35. read -p "Escriba algo: " palabra1 palabra2 palabra3
  36. echo $palabra1 $palabra2 $palabra3
  37. ¿Como se indican los comentarios dentro de un script?
  38. Las líneas que empiezan por "#" son comentarios.
  39. ¿Cómo se declaran y se hace referencia a variables dentro de un script?
  40. Las variables en Bash se definen como NOMBRE=valor (sin espacios antes o después del simbolo '=') y su valor se usa, poniendo el simbolo '$' delante del nombre de la variable, $NOMBRE.
  41.  
  42. 3.- Crear dentro del directorio personal del usuario logueado un directorio llamado
  43. practica-shell-script y dentro de él un archivo llamado mostrar.sh cuyo contenido sea el siguiente:
  44. mkdir practica-shell-script
  45. touch mostrar.sh
  46. a) Asignar al archivo creado los permisos necesarios de manera que pueda ejecutarlo
  47. chmod 777 mostrar.sh
  48. b) Ejecutar el archivo creado de la siguiente manera: ./mostrar
  49. c) ¿Qué resultado visualiza?
  50. Nada.
  51. d) Las backquotes (`) entre el comando whoami ilustran el uso de la sustitución de comandos. ¿Qué significa esto?
  52. Para incluir la salida de un comando dentro de una línea de comandos de otro comando, encierra el comando cuya salida quieres incluir, entre backquotes (`)
  53. e) Realizar modificaciones al script anteriormente creado de manera de poder mostrar distintos resultados (cuál es su directorio personal, el contenido de un directorio en particular, el espacio libre en disco, etc.). Pida que se introduzcan por teclado (entrada estándar) otros datos.
  54. gedit mostrar.sh
  55. echo "Directorio
  56. personal:`pwd`"
  57. echo “Contenido del directorio: `ls`
  58. echo “Espacio libre: `df`
  59.  
  60. 4.- Parametrización:
  61. ¿Cómo se acceden a los parámetros enviados al script al momento de su invocación?
  62. Existen dos categorías de estos: los parámetros posiciónales y los parámetros especiales.
  63. Los parámetros posiciónales
  64. Estos son simplemente lo argumentos pasados al script, cuando un script es invocado.
  65. Estos son almacenados en las variables reservadas 1,2,3,...9,10,11,... y pueden ser llamados con las expresiones $1,$2...${10},${11}...
  66. Nota: El shell Bourne está limitado a los parámetros del 0 al 9.
  67. Los parámetros especiales
  68. Estas también son variables reservadas que permite en algunos casos efectuar operaciones sobre los mismos parámetros.
  69. Estos parámetros son los siguientes:
  70. $0 Contiene el nombre del script tal como es invocado
  71. $* El conjunto de todos los parámetros en un solo argumento
  72. $@ El conjunto de argumentos, un argumento por parámetro
  73. $# El número de parámetros pasados al script
  74. $? El código de retorno del último comando
  75. $$ El PID del shell que ejecuta el script
  76. $! El PID del último proceso ejecutado en segundo plano
  77. $HOME el nombre del directorio personal del usuario
  78. 5.- ¿Cual es la funcionalidad de comando exit?
  79. Cierra las ventanas o las conexiones remotas establecidas o las shell abiertas.
  80. ¿Qué valores recibe como parámetro y cual es su significado?
  81. exit 6 :termina el script devolviendo el número indicado, lo que puede usarse para determinar condiciones de error.
  82. exit 0 :termina el script devolviendo 0, para indicar la finalización
  83. exitosa de tareas. Escribir sólo exit también devuelve código de error 0.
  84. 6.- El comando expr permite la evaluación de expresiones. Su sintaxis es: expr arg1 op arg2, donde arg1 y arg2 representan argumentos y op la operación de la expresión. Investigar que tipo de operaciones se pueden utilizar.
  85. + Suma
  86. - Resta
  87. / División
  88. \* Multiplicación
  89. % Modulo
  90.  
  91. 7.- El comando “test expresión” permite evaluar expresiones y generar un valor de
  92. retorno, true o false. Este comando puede ser reemplazado por el uso de corchetes de
  93. la siguiente manera [ expresión ].
  94. #!/bin/bash
  95. # Comentarios acerca de lo que hace el script
  96. # Siempre comento mis scripts, si no hoy lo hago
  97. # y mañana ya no me acuerdo de lo que quise hacer
  98. echo "Introduzca su nombre y apellido:"
  99. read nombre apellido
  100. echo "Fecha y hora actual:"
  101. date
  102. echo "Su apellido y nombre es:
  103. echo "$apellido $nombre"
  104. echo "Su usuario es: `whoami`"
  105. echo "Su directorio actual es:"
  106. pwd
  107. Investigar que tipo de expresiones pueden ser usadas con el comando test. Tenga en cuenta operaciones para: evaluación de archivos, evaluación de cadenas de caracteres y evaluaciones numéricas.
  108. Puede ser una evaluación: de cadenas de caracteres, números enteros, archivos (evaluamos permisos y existencia del archivo) u operadores lógicos que permiten realizar una combinación de varias evaluaciones.
  109.  
  110. 8.- Estructuras de control. Investigue la sintaxis de las siguientes estructuras de control
  111. incluidas en shell scripting:
  112. o if
  113. if [ condicion ]
  114. then bloque de comandos
  115. else
  116. bloque de comandos
  117. fi
  118. o case
  119. case variable in
  120. patron1) comandos condicion1;;
  121. patron2) comandos condicion2;;
  122. ...
  123. patron n) comandos condicion n;;
  124. *) comandos si no se cumplen ninguna;;
  125. esac
  126. o while
  127. While (condición)
  128. do
  129. comandos
  130. done
  131. o for
  132. - for variable in [lista de palabras]; do comandos; done
  133. - for ((variable=valor_inicial; a reporte.txt
  134.  
  135. 17.- Escribir un script que al ejecutarse imprima en pantalla los nombre de los archivos
  136. que se encuentran en el directorio actual, intercambiando minúsculas por mayúsculas,
  137. además de eliminar la letra a (mayúscula o minúscula)
  138. Ejemplo, directorio actual:
  139. IsO
  140. pepE
  141. Maria
  142. Si ejecuto: ./ejercicio17
  143. Obtendré como resultado:
  144. iSo
  145. PEPe
  146. mARIA
  147. Ayuda: Investigar el comando tr
  148. tr es un filtro que nos permite cambiar una determinada información de un archivo por otra.
  149. Cambia cada uno de los caracteres especificados en el conjunto inicial por los caracteres especificados en el conjunto final.
  150. ls | tr [:lower:] [:upper:]
  151.  
  152. 18.- Crear un script que verifique cada 10 segundos si un usuario se ha loqueado en el
  153. sistema (el nombre del usuario será pasado por parámetro). Cuando el usuario
  154. finalmente se loguee, el programa deberá mostrar el mensaje ”Usuario XXX logueado
  155. en el sistema” y salir.
  156. Ayuda: Investigar la sentencia sleep
  157.  
  158. #!/bin/bash
  159. #Recibe parametro un nombre de usuario
  160. #Ejemplo de Ejecucion ejercicio18usuario
  161. if [ $# -ne 1 ]
  162. then
  163. echo "La Cantidad de parametros es incorrecta"
  164. exit 1
  165. fi
  166. #Se podria validar contra el /etc/passwd que el usuario exista
  167. while true; do
  168. seLogueo=`who | grep $1 | wc -l`
  169. if [ $seLogueo != 0 ]
  170. then
  171. echo "usuario $1 logueado"
  172. exit 0
  173. fi
  174. sleep 10
  175. done
  176.  
  177. 19.- Escribir un Programa de “Menu de Comandos Amigable con el Usuario” llamado
  178. menu, el cual, al ser invocado, mostrará un menú con la selección para cada uno de
  179. los scripts creados en esta práctica. Las instrucciones de como proceder deben
  180. mostrarse junto con el menú. El menú deberá iniciarse y permanecer activo hasta que
  181. se seleccione Salir.
  182. Por ejemplo:
  183. MENU DE COMANDOS
  184. 03. Ejercicio 3
  185. 12. Evaluar Expresiones
  186. 13. Probar estructuras de control
  187. ...
  188. Ingrese la opción a ejecutar: 03
  189.  
  190. 20.- Realice un script que simule el comportamiento de una estructura de PILA e
  191. implemente las siguientes funciones aplicables sobre una estructura global definida en
  192. el script:
  193. push: Recibe un parámetro y lo agrega en la pila
  194. pop: Saca un elemento de la pila
  195. length: Devuelve la longitud de la pila
  196. print: Imprime todos los elementos de la pila
  197. #!/bin/bash
  198.  
  199. #Implementa una pila con arreglos
  200.  
  201. pila=()
  202.  
  203. function push
  204. {
  205. if [ $# -ne 1 ]
  206. then
  207. echo "La Cantidad de parametros es incorrecta"
  208. return 1
  209. fi
  210. longitud=${#pila[*]}
  211. pila[$longitud]=$1
  212. }
  213.  
  214. function pop
  215. {
  216. ultimoElem=`expr ${#pila[*]} - 1`
  217. echo ${pila[$ultimoElem]}
  218. unset pila[$ultimoElem]
  219. }
  220.  
  221.  
  222. function length
  223. {
  224. echo ${#pila[*]}
  225. }
  226.  
  227. function print
  228. {
  229. echo ${pila[*]}
  230. }
  231.  
  232.  
  233. 21.- Dentro del mismo script y utilizando las funciones implementadas agregue 10
  234. elementos a la pila, saque 3 de ellos, imprima la longitud de la cola y luego la totalidad
  235. de los elementos que en ella se encuentran.
  236. push primero
  237. push segundo
  238. push tercero
  239. push cuarto
  240. push quinto
  241. push sexto
  242. push septimo
  243. push octavo
  244. push noveno
  245. push decimo
  246. pop
  247. pop
  248. pop
  249. echo "Longitud:"
  250. length
  251.  
  252. 22.- Dada la siguiente declaración al comienzo de un script: num=(10 3 5 7 9 3 5 4) (la
  253. cantidad de elementos del arreglo puede variar). Implemente la función productoria
  254. dentro de este script, cuya tarea sea multiplicar todos los números del arreglo
  255. num=(1 3 5 7 9 3 5 4)
  256. function productoria
  257. {
  258. x=1
  259. LONG=`expr ${#num[*]} - 1`
  260. for i in `seq 0 $LONG`
  261. do
  262. x=`expr $x \* ${num[$i]}`
  263. done
  264. }
  265. productoria
  266. echo $x
  267.  
  268.  
  269.  
  270. 23.- Implemente un script que recorra un arreglo compuesto por números e imprima en pantalla sólo los números pares y que cuente sólo los números impares y los informe en pantalla al finalizar el recorrido
  271. arr=(1 2 3 4 5)
  272. impares=0
  273. for i in `seq 0 4`; do
  274. resto=`expr ${arr[$i]} % 2`
  275. if [ $resto = 0 ]; then
  276. echo ${arr[$i]}
  277. else impares=`expr $impares + 1`
  278. fi
  279. done
  280. echo Total impares:$impares
  281.  
  282. 24.- Dada la definición de 2 vectores del mismo tamaño y cuyas longitudes no se conocen.
  283. vector1=( 1 .. N)
  284. vector2=( 7 .. N)
  285. Por ejemplo vector1=( 1 80 65 35 2 ) y vector2=( 5 98 3 41 8 ).
  286. Complete este script de manera tal de implementar la suma elemento a elemento entre ambos vectores y que la misma sea impresa en pantalla de la siguiente manera:
  287. La suma de los elementos de la posición 0 de los vectores es 6
  288. La suma de los elementos de la posición 1 de los vectores es 178
  289. La suma de los elementos de la posición 4 de los vectores es 10
  290.  
  291. 25.- Realice un script que agregue en un arreglo todos los nombres de los usuarios
  292. del
  293. sistema pertenecientes al grupo “users”. Adicionalmente el script puede recibir como
  294. parametro:
  295. -b n: Retorna el elemento de la posición n del arreglo si el mismo existe. Caso
  296. contrario, un mensaje de error.
  297. -l: Devuelve la longitud del arreglo
  298. -i: Imprime todos los elementos del arreglo en pantalla
  299. array=($(cat /etc/group | grep -E ^users: | cut -d: -f4 | tr ',' ' '))
  300. echo ${array[*]}
  301.  
  302. arr=(1 2 3 4 5)
  303. case $1 in
  304. "-b")
  305. long= `expr ${#arr[*]} - 1`
  306. if [ $2 < $long ]
  307. then   
  308. echo ${arr[$2]}
  309. fi;;
  310. "-l")
  311. echo ${#arr[*]};;
  312. "-i")
  313. echo ${arr[*]};;
  314. *)
  315. echo "Parametro incorrecto"
  316. esac
  317.  
  318. 26.- Escriba un script que reciba una cantidad desconocida de parámetros al momento
  319. de su invocación (debe validar que al menos se reciba uno). Cada parámetro
  320. representa la ruta absoluta de un archivo o directorio en el sistema. El script deberá
  321. iterar por todos los parámetros recibidos, y solo para aquellos parámetros que se
  322. encuentren en posiciones impares (el primero, el tercero, el quinto, etc.), verificar si
  323. el archivo o directorio existen en el sistema, imprimiendo en pantalla que tipo de objeto
  324. es (archivo o directorio). Además, deberá informar la cantidad de archivos o directorios
  325. inexistentes en el sistema.
  326.  
  327.  
  328.  
  329.  
  330. if [ $# -eq 0 ]; then
  331. echo Cantidad de parametros incorrecta.
  332. exit
  333. fi
  334. INEX=0
  335. x=1
  336. for i in $*; do
  337. RESTO=`expr $x % 2`
  338. if [ $RESTO -ne 0 ]; then
  339. if [ -e $i ]; then
  340. if [ -d $i ]; then
  341. echo "$i es un directorio."
  342. else echo "$i es un fichero."
  343. fi
  344. else INEX=`expr $INEX + 1` 
  345. fi
  346. fi
  347. x=`expr $x + 1`
  348. done
  349. echo Inexistentes:$INEX
  350.  
  351. 27.- Realice un script que implemente a través de la utilización de funciones las operaciones básicas sobre arreglos:
  352. o inicializar: Crea un arreglo llamado array vacío
  353. o agregar_elem : Agrega al final del arreglo el parámetro recibido
  354. o eliminar_elem : Elimina del arreglo el elemento que se encuentra en la posición recibida como parámetro. Debe validar que se reciba una posición válida
  355. o longitud: Imprime la longitud del arreglo en pantalla
  356. o imprimir: Imprime todos los elementos del arreglo en pantalla
  357. o inicializarConValores : Crea un arreglo con longitud y en todas las posiciones asigna el valor
  358. function inicializar
  359. {
  360. array=()
  361. }
  362.  
  363. function agregar_elem
  364. {
  365. if [ $# -ne 1 ]; then
  366. echo "La Cantidad de parametros es incorrecta"
  367. return 1
  368. fi
  369. longitud=${#array[*]}
  370. array[$longitud]=$1
  371. }
  372.  
  373. function eliminar_elem
  374. {
  375. if [ $# -ne 1 ]; then
  376. echo "La Cantidad de parametros es incorrecta"
  377. return 1
  378. fi 
  379. ultimoElem=`expr ${#array[*]} - 1`
  380. if [ $1 -le $ultimoElem ];then
  381. echo ${array[$1]}
  382. unset array[$1]
  383. else echo "La posición no es válida"
  384. fi
  385. }
  386.  
  387. function longitud
  388. {
  389. echo ${#array[*]}
  390. }
  391.  
  392. function imprimir
  393. {
  394. echo ${array[*]}
  395. }
  396.  
  397. function inicializarConValores
  398. {
  399. LONG=`expr $1 - 1`
  400. for i in `seq 0 $LONG`; do
  401. array[$i]=$2
  402. done
  403. }
  404.  
  405. 28.- Realice un script que reciba como parámetro el nombre de un directorio. Deberá
  406. validar que el mismo exista y de no existir causar la terminación del script con código
  407. de error 4. Si el directorio existe deberá
  408. contar por separado la cantidad de archivos
  409. que en él se encuentran para los cuales el usuario que ejecuta el script tiene permiso
  410. de lectura y escritura, e informar dichos valores en pantalla. En caso de encontrar
  411. subdirectorios, no deberán procesarse, y tampoco deberán ser tenidos en cuenta para
  412. la suma a informar.
  413. if [ $# -ne 1 ]; then
  414. echo Cantidad de parametros incorrecta.
  415. exit
  416. fi
  417. if [ -e $1 ]; then
  418. CANT=0
  419. for i in `ls $1`; do
  420. if [ -f $i ]&&[ -r $i ]&&[ - w $i ]; then
  421. CANT=`expr $CANT + 1`  
  422. fi
  423. done
  424. echo $CANT
  425. else echo "No existe directorio."
  426. exit 4
  427. fi
  428.  
  429. 29.- Implemente un script que agregue a un arreglo todos los archivos del directorio
  430. /home cuya terminación sea .doc. Adicionalmente, implemente las siguientes
  431. funciones que le permitan acceder a la estructura creada:
  432. o verArchivo : Imprime el archivo en pantalla si el mismo
  433. se encuentra en el arreglo. Caso contrario imprime el mensaje de error “Archivo
  434. no encontrado” y devuelve como valor de retorno 5
  435. o cantidadArchivos: Imprime la cantidad de archivos del /home con terminación
  436. .doc
  437. o borrarArchivo : Consulta al usuario si quiere eliminar el
  438. archivo lógicamente. Si el usuario responde Si, elimina el elemento solo del
  439. arreglo. Si el usuario responde No, elimina el archivo del arreglo y también del
  440. FileSystem. Debe validar que el archivo exista en el arreglo. En caso de no
  441. existir, imprime el mensaje de error “Archivo no encontrado” y devuelve como
  442. valor de retorno 10
  443.  
  444.  
  445. if [ $# -ne 1 ]; then
  446. echo "La Cantidad de parametros es incorrecta"
  447. exit 1
  448. fi
  449. ARRAY=()
  450. LISTA=`ls $1 |
  451. grep ".doc$"`
  452. for i in $LISTA; do
  453. ARRAY[$pos]=$i
  454. pos=`expr $pos + 1`
  455. done
  456.  
  457. function verArchivo
  458. {
  459. if [ $# -ne 1 ]; then
  460. echo "La Cantidad de parametros es incorrecta"
  461. exit 1
  462. fi
  463. LONG=`expr ${#ARRAY[*]} - 1`
  464. for i in `seq 0 $LONG`; do
  465. if [ ${ARRAY[$i]} = $1 ]; then
  466. echo $1
  467. return 0
  468. fi
  469. done
  470. echo "Archivo no encontrado"
  471. return 5   
  472. }
  473.  
  474. function cantidadArchivos
  475. {
  476. echo ${#ARRAY[*]}
  477. }
  478.  
  479. function borrarArchivo
  480. {
  481. if [ $# -ne 2 ]; then
  482. echo "La Cantidad de parametros es incorrecta"
  483. exit 1
  484. fi
  485. LONG=`expr ${#ARRAY[*]} - 1`
  486. i=0
  487. x=0
  488. while [ $i -le $LONG ] && [ $x -eq 0 ]; do
  489. if [ ${ARRAY[$i]} = $2 ]; then
  490. unset ARRAY[$i]
  491. x=1
  492. fi
  493. i=`expr $i + 1`
  494. done
  495. if [ $x -eq 0 ]; then
  496. echo "Archivo no encontrado"
  497. return 10
  498. else
  499. echo "Confirmar borrado lógico. (si-no)"
  500. read CONF
  501. if [ $CONF = "no" ]; then
  502. rm $1/$2
  503. fi
  504. fi
  505. }
  506.  
  507. 30.- Realice un script que mueva todos los programas del directorio actual (archivos
  508. ejecutables) hacia el subdirectorio “bin” del directorio HOME del usuario actualmente
  509. logueado. El script debe imprimir en pantalla los nombres de los que mueve, e indicar
  510. cuántos ha movido, o que no ha movido ninguno. Si el directorio “bin” no existe,
  511. deberá ser creado
  512. ACTUAL=`pwd`
  513. TOTAL=0
  514. if [ ! -d /home/marilyn/img ]; then
  515. mkdir /home/marilyn/img
  516. fi 
  517. for i in `ls $ACTUAL`; do
  518. if [ -x $i ]&&[ ! -d $i ]; then
  519. mv $i /home/marilyn/img
  520. TOTAL=` expr $TOTAL + 1`
  521. echo "Archivo $i movido"
  522. fi
  523. done
  524. if [ $TOTAL -eq 0 ]; then
  525. echo "No se movió ningun fichero"
  526. fi
  527. echo "Se movieron $TOTAL fichero"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement