El método más fácil para leer argumentos se puede describir de la siguiente manera;
Cada argumento es referenciado y analizado por $IFS
o definido actualmente internal file separator
. El carácter predeterminado es un espacio.
Por ejemplo, tome lo siguiente; # ./script.sh arg1 arg2
La lista de argumentos en ese ejemplo es arg1 = $1
y arg2 = $2
que se puede reescribir como arg1 arg2 = [email protected]
.
Otra nota es el uso de una lista de registros, ¿con qué frecuencia cambia eso? Mi suposición es diaria. ¿Por qué no usar la salida del directorio como matriz de su ciclo iterativo? Por ejemplo;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
O mejor aún, pasa al uso de functions
en bash para eliminar el desorden.
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
Si bien estas son simplemente sugerencias para mejorar su conocimiento de scripts de shell, debo saber si hay un error que está recibiendo y también necesitaría conocer los detalles de cada código de scripts o funcionalidad. Haciendo uso del -x
El argumento también ayuda a depurar secuencias de comandos.
Si simplemente está transfiriendo registros, es posible que desee eliminar todos los scripts y utilizar rsync
, rsyslog
o syslog
ya que todos ellos son mucho más adecuados para la tarea en cuestión.
xargs -n 1 ./script.sh <list.txt
En este ejemplo, xargs
ejecutará ./script.sh
varias veces con un solo argumento leído desde su entrada estándar.
La entrada estándar proviene del archivo list.txt
a través de una simple redirección de entrada de shell. Esto supone que el list.txt
El archivo contiene un argumento para usar con el script por línea.
El ./script.sh
el script se ejecutará una vez por cada línea en el list.txt
archivo.
Sobre el -n
marca a xargs
-n number
Invocar utilidad usando tantos argumentos de entrada estándar como sea posible, hasta number
(un entero decimal positivo) argumentsmaximum.
Otra solución sería permitir que el script se lea directamente desde list.txt
, o para tomar múltiples argumentos de línea de comando (las entradas de list.txt
), y para descargar los archivos en uno o varios lotes. Pero como no sabemos cuál es la mecánica del script, no puedo dar ninguna explicación detallada de cómo hacer esto.
dentro del script:necesita un ciclo de lectura como while read ; do ......... ; done < filename
para tratar líneas como variable $REPLY...
por ejemplo
while read
do
mv $REPLY $REPLY.old
done < liste.txt
cambiará el nombre de cualquier nombre de archivo desde dentro de liste.txt a filename.old
ahora tiene la estructura que puede adaptar a sus necesidades dependiendo de lo que quiera decir con " en el nombre de cada archivo de registro en list.txt para ser ejecutado". :)