<Anterior | Contenido | Siguiente>
Acceso a elementos de matriz
Entonces, ¿para qué sirven las matrices? Así como muchas tareas de administración de datos se pueden realizar con un programa de hoja de cálculo, muchas tareas de programación se pueden realizar con arreglos.
Consideremos un ejemplo simple de recopilación y presentación de datos. Construiremos un script que examine los tiempos de modificación de los archivos en un directorio específico. A partir de estos datos, nuestro script generará una tabla que muestra a qué hora del día se modificaron por última vez los archivos. Tal secuencia de comandos podría usarse para determinar cuándo un sistema está más activo. Este guión, llamado horas, produce este resultado:
[yo @ linuxbox ~] $ horas .
Hora | archivos | Hora | archivos |
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
Archivos totales = 80
Ejecutamos el horas programa, especificando el directorio actual como destino. Produce una tabla que muestra, para cada hora del día (0-23), cuántos archivos se modificaron por última vez. El código para producir esto es el siguiente:
#! / Bin / bash
# horas: secuencia de comandos para contar archivos por uso de tiempo de modificación () {
echo "uso: $ {0 ## * /} directorio"> & 2
}
#! / Bin / bash
# horas: secuencia de comandos para contar archivos por uso de tiempo de modificación () {
echo "uso: $ {0 ## * /} directorio"> & 2
}
# Compruebe que el argumento es un directorio si [[! -d $ 1]]; luego
salida de uso 1
fi
# Inicializar matriz
para i en {0..23}; hacer horas [i] = 0; hecho
# Recolectar datos
for i in $ (stat -c% y "$ 1" / * | cut -c 12-13); hacer j = $ {i / # 0}
((++ horas [j])) ((++ recuento))
done
# Mostrar datos
echo -e "Hora \ tFiles \ tHour \ tFiles" echo -e "---- \ t ----- \ t ---- \ t -----" para i en {0..11} ; hacer
j = $ ((i + 12))
printf "% 02d \ t% d \ t% 02d \ t% d \ n" $ i $ {horas [i]} $ j $ {horas [j]} hecho
printf "\ nTotal de archivos =% d \ n" $ count
# Compruebe que el argumento es un directorio si [[! -d $ 1]]; luego
salida de uso 1
fi
# Inicializar matriz
para i en {0..23}; hacer horas [i] = 0; hecho
# Recolectar datos
for i in $ (stat -c% y "$ 1" / * | cut -c 12-13); hacer j = $ {i / # 0}
((++ horas [j])) ((++ recuento))
done
# Mostrar datos
echo -e "Hora \ tFiles \ tHour \ tFiles" echo -e "---- \ t ----- \ t ---- \ t -----" para i en {0..11} ; hacer
j = $ ((i + 12))
printf "% 02d \ t% d \ t% 02d \ t% d \ n" $ i $ {horas [i]} $ j $ {horas [j]} hecho
printf "\ nTotal de archivos =% d \ n" $ count
El script consta de una función (personal) y un cuerpo principal con cuatro secciones. En la primera sección, verificamos que haya un argumento de línea de comando y que sea un directorio. Si no es así, mostramos el mensaje de uso y salimos.
La segunda sección inicializa la matriz. horas. Lo hace asignando a cada elemento un valor de cero. No hay ningún requisito especial para preparar matrices antes de su uso, pero nuestro script debe asegurarse de que ningún elemento esté vacío. Tenga en cuenta la forma interesante en que se construye el bucle. Empleando expansión de corsé ({0..23}), podemos generar fácilmente una secuencia de palabras para el para mando.
La siguiente sección recopila los datos ejecutando el stat programa en cada archivo del directorio. Usamos cut para extraer la hora de dos dígitos del resultado. Dentro del ciclo, necesitamos eliminar los ceros iniciales del campo de la hora, ya que el shell intentará (y finalmente fallará) interpretar los valores del "00" al "09" como números octales (consulte la Tabla 34-2). A continuación, incrementamos el valor del elemento de matriz correspondiente a la hora del día. Finalmente, incrementamos un contador (contar) para rastrear el número total de archivos en el directorio.
La última sección del script muestra el contenido de la matriz. Primero generamos un par de líneas de encabezado y luego ingresamos un ciclo que produce cuatro columnas de salida. Por último, generamos el recuento final de archivos.