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!

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top