Bourne shell script - simple pour la syntaxe de la boucle
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!
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"