Metode termudah untuk membaca argumen dapat dijelaskan sebagai berikut;
Setiap argumen dirujuk dan diuraikan oleh $IFS
atau saat ini mendefinisikan internal file separator
. Karakter default adalah spasi.
Misalnya, ambil yang berikut ini; # ./script.sh arg1 arg2
Daftar argumen dalam contoh tersebut adalah arg1 = $1
dan arg2 = $2
yang dapat ditulis ulang sebagai arg1 arg2 = [email protected]
.
Catatan lain adalah penggunaan daftar log, seberapa sering itu berubah? Asumsi saya adalah setiap hari. Mengapa tidak menggunakan output direktori sebagai larik loop berulang Anda? Misalnya;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
Atau lebih baik lagi, gunakan functions
di bash untuk menghilangkan kekacauan.
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
Meskipun ini hanyalah saran untuk meningkatkan pengetahuan skrip shell Anda, saya harus tahu jika ada kesalahan yang Anda dapatkan dan juga perlu mengetahui detail dari setiap kode dan atau fungsi skrip. Memanfaatkan -x
argumen juga membantu men-debug skrip.
Jika Anda hanya mentransfer log, Anda mungkin ingin menghapus semua skrip dan menggunakan rsync
, rsyslog
atau syslog
karena semuanya jauh lebih cocok untuk tugas yang dimaksud.
xargs -n 1 ./script.sh <list.txt
Dalam contoh ini, xargs
akan mengeksekusi ./script.sh
beberapa kali dengan satu argumen yang dibaca dari input standarnya.
Masukan standar berasal dari file list.txt
melalui pengalihan input shell sederhana. Ini mengasumsikan bahwa list.txt
file berisi satu argumen untuk digunakan dengan skrip per baris.
./script.sh
skrip akan dieksekusi sekali untuk setiap baris di list.txt
berkas.
Tentang -n
tandai ke xargs
-n number
Panggil utilitas menggunakan sebanyak mungkin argumen input standar, hingga
number
(bilangan bulat desimal positif) argumenmaksimum.
Solusi lain adalah mengizinkan skrip untuk membaca langsung dari list.txt
, atau mengambil beberapa argumen baris perintah (entri dari list.txt
), dan untuk mengunduh file dalam satu atau beberapa kumpulan. Namun karena kami tidak mengetahui mekanisme skripnya, saya tidak dapat memberikan penjelasan mendetail tentang cara melakukannya.
di dalam skrip:Anda memerlukan loop baca seperti while read ; do ......... ; done < filename
untuk memperlakukan baris sebagai variabel $REPLY...
misalnya
while read
do
mv $REPLY $REPLY.old
done < liste.txt
akan mengganti nama file apa pun dari dalam liste.txt menjadi filename.old
Anda memiliki struktur sekarang Anda dapat menyesuaikan dengan kebutuhan Anda tergantung pada apa yang Anda maksud dengan " di setiap nama file log di list.txt untuk dieksekusi." :)