Il metodo più semplice per leggere gli argomenti può essere descritto come segue;
Ogni argomento è referenziato e analizzato dal $IFS
o internal file separator
attualmente definito . Il carattere predefinito è uno spazio.
Ad esempio, prendi quanto segue; # ./script.sh arg1 arg2
L'elenco degli argomenti in questo esempio è arg1 = $1
e arg2 = $2
che può essere riscritto come arg1 arg2 = [email protected]
.
Un'altra nota è l'uso di un elenco di registri, quanto spesso cambia? La mia ipotesi è quotidiana. Perché non utilizzare l'output della directory come matrice del ciclo iterativo? Ad esempio;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
O meglio ancora, passa all'uso di functions
in bash per eliminare il disordine.
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
Sebbene questi siano solo suggerimenti per migliorare la tua conoscenza degli script di shell, devo sapere se stai riscontrando un errore e avrei anche bisogno di conoscere i dettagli di ciascun codice e / o funzionalità di script. Facendo uso del -x
argument aiuta anche a eseguire il debug degli script.
Se stai semplicemente trasferendo i log, potresti voler eliminare tutti gli script e utilizzare rsync
, rsyslog
o syslog
poiché sono tutti molto più adatti per l'attività in questione.
xargs -n 1 ./script.sh <list.txt
In questo esempio, xargs
eseguirà ./script.sh
più volte con un singolo argomento letto dal suo input standard.
L'input standard proviene dal file list.txt
tramite un semplice reindirizzamento dell'input della shell. Ciò presuppone che il file list.txt
contiene un argomento da utilizzare con lo script per riga.
Il ./script.sh
lo script verrà eseguito una volta per ogni riga nel list.txt
file.
Informazioni sul -n
flag a xargs
-n number
Richiama utility utilizzando il maggior numero possibile di argomenti di input standard, fino a
number
(un intero decimale positivo) argumentsmaximum.
Un'altra soluzione sarebbe consentire allo script di leggere direttamente da list.txt
, o per prendere più argomenti della riga di comando (le voci da list.txt
) e per scaricare i file in uno o più batch. Ma dal momento che non sappiamo quali siano i meccanismi della sceneggiatura, non posso fornire alcuna spiegazione dettagliata su come procedere.
all'interno dello script:è necessario un ciclo di lettura come while read ; do ......... ; done < filename
trattare le righe come variabile $REPLY...
ad esempio
while read
do
mv $REPLY $REPLY.old
done < liste.txt
rinominerà qualsiasi nome di file all'interno di liste.txt in filename.old
ora hai la struttura che puoi adattare alle tue esigenze a seconda di cosa intendi per " nel nome di ogni file di registro in list.txt da eseguire." :)