Bourne Shell Scripting - simple para la sintaxis del bucle
Pregunta
No estoy totalmente nuevo en la programación, pero no estoy experimentado con exactitud. Quiero escribir pequeño script para la práctica.
Esto es lo que tengo hasta ahora:
#!/bin/sh
name=$0
links=$3
owner=$4
if [ $# -ne 1 ]
then
echo "Usage: $0 <directory>"
exit 1
fi
if [ ! -e $1 ]
then
echo "$1 not found"
exit 1
elif [ -d $1 ]
then
echo "Name\t\tLinks\t\tOwner\t\tDate"
echo "$name\t$links\t$owner\t$date"
exit 0
fi
Básicamente lo que estoy tratando de hacer es tener el visto escritura a través de todos los archivos en un directorio especificado y luego se muestra el nombre de cada archivo con la cantidad de enlaces que tiene, su propietario, y la fecha en que fue creado . ¿Cuál sería la sintaxis para la visualización de la fecha de creación o al menos la fecha de la última modificación del archivo?
Otra cosa es, ¿cuál es la sintaxis para crear un bucle? Por lo que entiendo que tendría que escribir algo como por $ 1 en $ 1 ($ 1 siendo todos los archivos en el directorio que el usuario escribió en la correcta?) Y luego ir a través de la comprobación de cada archivo y la visualización de la información de cada uno. ¿Cómo iba a comenzar y terminar el bucle (¿cuál es la sintaxis para esto?).
Como se puede ver que no soy la programación del shell Bourne muy familiar. Si usted tiene alguna sitios web útiles o tienen una mejor manera de abordar este favor muéstrame!
Solución
Sintaxis para un bucle:
for var in list
do
echo $var
done
por ejemplo:
for var in *
do
echo $var
done
Lo que es posible que desee considerar sin embargo, es algo como esto:
ls -l | while read perms links owner group size date1 date2 time filename
do
echo $filename
done
que divide la salida del ls -l
en los campos de la marcha por lo que no tiene que hacer ninguna división de sí mismo.
El campo de división está controlada por los IFS shell variable, que por defecto contiene un espacio, lengüeta y nueva línea. Si cambia esto en un script de shell, recuerde volver a cambiarlo. Por lo tanto, cambiando el valor de IFS se puede, por ejemplo, archivos CSV de análisis sintáctico de este valor está a una coma. Este ejemplo lee tres campos de una CSV y escupe la segunda y sólo tercero (que es efectivamente la cáscara equivalente de cut -d, -f2,3 inputfile.csv
)
oldifs=$IFS
IFS=","
while read field1 field2 field3
do
echo $field2 $field3
done < inputfile.csv
IFS=oldifs
(nota: no es necesidad para revertir IFS, pero generalmente lo hacen para asegurarse de que su posterior procesamiento de texto en un script no se ve afectada después de que he terminado con ella).
Un montón de documentación sobre el for
ambos bucles y while
; sólo Google para ello: -)
Otros consejos
Es posible que desee ver en Guía avanzada Bash-Scripting . Cuenta con una sección que explica bucles.
Es mejor utilizar find
con la opción -printf "%P\t%n\t%u\t%t"
$1
es el primer parámetro de posición, por lo $3
es la tercera y $4
es la cuarta. No tienen nada que ver con el directorio (o sus archivos) el guión fue iniciado. Si la secuencia de comandos se comenzó a usar esto, por ejemplo:
./script.sh apple banana cherry date elderberry
entonces la variable $1
sería igual a "Apple" y así sucesivamente. El $#
parámetro especial es el recuento de los parámetros posicionales, que en este caso sería de cinco.
El nombre de la secuencia de comandos está contenida en $0
y $*
y $@
son matrices que contienen todos los parámetros posicionales que se comportan de manera diferente dependiendo de si aparecen entre comillas.
Se puede hacer referencia a los parámetros posicionales usando un índice de estilo subcadena:
${@:2:1}
daría "banana" usando el ejemplo anterior. Y:
${@: -1}
o
${@:$#}
daría la última ( "saúco"). Tenga en cuenta que se requiere el espacio antes del signo menos en este contexto.
for x in "$@"; do
echo "$x"
done
El "$ @" protege cualquier espacio en blanco en los nombres de archivo suministrados. Obviamente, hacer su trabajo real en lugar de "echo $ x", que no está haciendo mucho. Pero $ @ es toda la basura suministrado en la línea de comandos a su script.
Pero también, sus fianzas de guión si # $ no es igual a 1, pero que al parecer están esperando por completo hasta 4 argumentos (de ahí los $ 4 se hace referencia en la primera parte de la secuencia de comandos).
suponiendo que tiene hallazgo GNU en su sistema
find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"