La méthode la plus simple pour lire les arguments peut être décrite comme suit :
Chaque argument est référencé et analysé par le $IFS
ou internal file separator
actuellement défini . Le caractère par défaut est un espace.
Par exemple, prenez ce qui suit ; # ./script.sh arg1 arg2
La liste d'arguments dans cet exemple est arg1 = $1
et arg2 = $2
qui peut être réécrit sous la forme arg1 arg2 = [email protected]
.
Une autre note est l'utilisation d'une liste de journaux, à quelle fréquence cela change-t-il ? Mon hypothèse est quotidienne. Pourquoi ne pas utiliser la sortie du répertoire comme tableau de votre boucle itérative ? Par exemple ;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
Ou mieux encore, passez à l'utilisation de functions
dans bash pour éliminer l'encombrement.
function process_file()
{
# transfer file code/command
}
function iterate_dir()
{
local -a dir=($(ls $1))
for file in ${dir[@]}; do
process_file $file
done
}
iterate_dir /path/to/log/for
Bien que ce ne soient que des suggestions pour améliorer vos connaissances en matière de scripts shell, je dois savoir s'il y a une erreur que vous obtenez et j'aurais également besoin de connaître les détails de chaque code de script et/ou fonctionnalité. Utilisation du -x
aide également à déboguer les scripts.
Si vous transférez simplement des journaux, vous souhaiterez peut-être supprimer tous les scripts et utiliser rsync
, rsyslog
ou syslog
car ils sont tous beaucoup plus adaptés à la tâche en question.
xargs -n 1 ./script.sh <list.txt
Dans cet exemple, xargs
exécutera ./script.sh
plusieurs fois avec un seul argument lu depuis son entrée standard.
L'entrée standard provient du fichier list.txt
via une simple redirection d'entrée du shell. Cela suppose que le list.txt
le fichier contient un argument à utiliser avec le script par ligne.
Le ./script.sh
le script sera exécuté une fois pour chaque ligne dans le list.txt
fichier.
À propos du -n
indicateur à xargs
-n number
Appeler utilitaire en utilisant autant d'arguments d'entrée standard que possible, jusqu'à
number
(un entier décimal positif) argumentsmaximum.
Une autre solution serait de permettre au script de lire directement depuis list.txt
, ou pour prendre plusieurs arguments de ligne de commande (les entrées de list.txt
), et de télécharger les fichiers en un ou plusieurs lots. Mais puisque nous ne connaissons pas la mécanique du script, je ne peux pas donner d'explication détaillée sur la façon de procéder.
à l'intérieur du script :vous avez besoin d'une boucle de lecture comme while read ; do ......... ; done < filename
pour traiter les lignes comme des variables $REPLY...
par exemple
while read
do
mv $REPLY $REPLY.old
done < liste.txt
renommera n'importe quel nom de fichier à l'intérieur de liste.txt en filename.old
vous avez maintenant la structure que vous pouvez adapter à vos besoins en fonction de ce que vous entendez par " dans le nom de chaque fichier journal dans list.txt à exécuter." :)