Nejjednodušší způsob čtení argumentů lze popsat následovně;
Každý argument je odkazován a analyzován pomocí $IFS
nebo aktuálně definovaný internal file separator
. Výchozí znak je mezera.
Vezměme například následující; # ./script.sh arg1 arg2
Seznam argumentů v tomto příkladu je arg1 = $1
a arg2 = $2
který lze přepsat jako arg1 arg2 = [email protected]
.
Další poznámka je použití seznamu logů, jak často se to mění? Můj předpoklad je denní. Proč nepoužít výstup adresáře jako pole vaší iterační smyčky? Například;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
Nebo ještě lépe, přejděte k použití functions
v bash k odstranění nepořádku.
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
I když jsou to pouze návrhy, jak zlepšit vaše znalosti skriptování v shellu, musím vědět, zda se nejedná o chybu, kterou dostáváte, a také bych potřeboval znát podrobnosti o kódu a/nebo funkčnosti každého skriptu. Využití -x
argument také pomáhá ladit skriptování.
Pokud pouze přenášíte protokoly, možná budete chtít odstranit všechny skripty dohromady a použít rsync
, rsyslog
nebo syslog
protože všechny jsou pro daný úkol mnohem vhodnější.
xargs -n 1 ./script.sh <list.txt
V tomto příkladu xargs
spustí ./script.sh
vícekrát s jedním argumentem přečteným z jeho standardního vstupu.
Standardní vstup pochází ze souboru list.txt
přes jednoduché přesměrování vstupu shellu. To předpokládá, že list.txt
soubor obsahuje jeden argument pro použití se skriptem na řádek.
./script.sh
skript bude proveden jednou pro každý řádek v list.txt
soubor.
O -n
příznak na xargs
-n number
Vyvolejte nástroj použití co největšího počtu standardních vstupních argumentů, až do
number
(kladné dekadické celé číslo) argumentsmaximum.
Dalším řešením by bylo umožnit skriptu číst přímo z list.txt
, nebo převzít více argumentů příkazového řádku (položky z list.txt
) a ke stažení souborů v jedné nebo několika dávkách. Ale protože nevíme, jaká je mechanika skriptu, nemohu podat žádné podrobné vysvětlení, jak to udělat.
uvnitř skriptu:potřebujete smyčku čtení jako while read ; do ......... ; done < filename
zacházet s řádky jako s proměnnou $REPLY...
například
while read
do
mv $REPLY $REPLY.old
done < liste.txt
přejmenuje jakýkoli název souboru ze souboru liste.txt na soubor.old
nyní máte strukturu, kterou můžete přizpůsobit svým potřebám v závislosti na tom, co rozumíte pod pojmem " v názvu každého souboru protokolu v souboru list.txt, který se má spustit." :)