Question

Je ne suis pas tout à fait nouveau à la programmation, mais je ne suis pas exactement connu. Je veux écrire petit script shell pour la pratique.

Voici ce que j'ai à ce jour:

#!/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

En fait ce que je suis en train de faire est d'avoir le script de passer par tous les fichiers dans un répertoire spécifié puis afficher le nom de chaque fichier avec la quantité de liens qu'il a, son propriétaire, et la date de création . Quelle serait la syntaxe pour afficher la date de création ou au moins la date de la dernière modification du fichier?

Une autre chose est, quelle est la syntaxe pour créer une boucle? D'après ce que je comprends que je dois écrire quelque chose comme pour 1 $ 1 $ (1 $ étant tous les fichiers dans le répertoire de l'utilisateur tapé correct?), Puis passer par la vérification de chaque fichier et l'affichage des informations pour chacun. Comment puis-je commencer et terminer la boucle (ce qui est la syntaxe pour cela?).

Comme vous pouvez le voir, je ne suis pas très familier programmation bourne shell. Si vous avez des sites Web utiles ou avoir une meilleure façon d'aborder cette s'il vous plaît me montrer!

Était-ce utile?

La solution

Syntaxe pour une boucle for:

for var in list
do
    echo $var
done

par exemple:

for var in *
do
    echo $var
done

Ce que vous voudrez peut-être à considérer est cependant quelque chose comme ceci:

ls -l | while read perms links owner group size date1 date2 time filename
do
   echo $filename
done

qui divise la sortie de ls -l dans les champs de la volée de sorte que vous n'avez pas besoin de faire une séparation vous.

Le champ de fractionnement est commandé par l'IFS shell variable, qui par défaut contient un espace intercalaire et retour à la ligne. Si vous modifiez ce dans un script shell, souvenez-vous de le changer en arrière. Ainsi, en changeant la valeur de l'IFS, vous pouvez, par exemple, analyser les fichiers CSV en réglant ce paramètre une virgule. cet exemple lit trois champs d'un fichier CSV et recrache les 2e et 3e seulement (il est effectivement l'équivalent shell de cut -d, -f2,3 inputfile.csv)

oldifs=$IFS
IFS=","
while read field1 field2 field3
do 
    echo $field2 $field3
done < inputfile.csv
IFS=oldifs

(note: vous n'avez pas besoin pour revenir IFS, mais je généralement pour vous assurer que le traitement ultérieur de texte dans un script est pas affecté après que je suis fait avec elle).

Beaucoup de documentation sur les sur les deux boucles de for et while; google juste pour elle: -)

Autres conseils

Vous pouvez regarder Guide avancé d'écriture des scripts Bash . Il a une section qui explique les boucles.

Je suggère d'utiliser find avec l'-printf "%P\t%n\t%u\t%t" option

$1 est le premier paramètre de position, de sorte que $3 est le troisième et le quatrième est $4. Ils ont rien à voir avec le répertoire (ou ses fichiers) le script a été démarré. Si votre script a été commencé à utiliser ceci, par exemple:

./script.sh apple banana cherry date elderberry

alors la $1 variable serait égale à « pomme » et ainsi de suite. Le $# de paramètre spécial est le nombre de paramètres de position, qui dans ce cas serait de cinq ans.

Le nom du script est contenu dans $0 et $* et $@ sont des tableaux qui contiennent tous les paramètres de position qui se comportent différemment selon qu'ils apparaissent entre guillemets.

Vous pouvez consulter les paramètres de position à l'aide d'un index de style sous-chaîne:

${@:2:1}

donnerait « banane » en utilisant l'exemple ci-dessus. Et:

${@: -1}

ou

${@:$#}

donnerait le dernier ( "sureau"). Notez que l'espace avant le signe moins est nécessaire dans ce contexte.

for x in "$@"; do
    echo "$x"
done

Le « @ $ de » protège les espaces dans les noms de fichiers fournis. De toute évidence, faire votre travail réel à la place de « echo $ x », ce qui ne fait pas beaucoup. Mais @ $ est de tous les déchets fournis sur la ligne de commande à votre script.

Mais aussi, votre script renfloue si # $ n'est pas égal à 1, mais vous attendez apparemment complètement jusqu'à 4 arguments (d'où le 4 $, vous faites référence dans la première partie de votre script).

en supposant que vous avez GNU trouver sur votre système

find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top