Saya tahu ini pasti pertanyaan yang aneh, tetapi bagi saya, itu selalu berkembang C
, C++
dan Java
(dan sekarang bash
) tampaknya lebih sulit, aneh. Saya mencoba memeriksa apakah md5
dan filename
dari dua daftar (satu dari server jauh saya dan satu lagi dari server lokal saya) cocok. Inilah yang saya lakukan sejauh ini:
#!/bin/bash
datacenter="amazon"
hostname=`hostname`;
path="backup/server245"
s3=`s3cmd ls --list-md5 s3://company-backup/company/"$datacenter"/"$hostname"/"$path"/`;
s3_list=$(echo "$s3" | tr -s ' ' | cut -d ' ' -f 4,5 | sed 's= .*/= =');
echo "$s3_list"
locally=`md5sum /"$path"/*.gz`;
locally_list=$(echo "$locally" | sed 's= .*/= =');
echo "$locally_list";
Ini memberi saya hasil sebagai berikut:
S3 LIST
d41d8cd98f00b204e9800998ecf8427e
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
31d90af7969f5003b27f68e27e7f2cb1 app.gz
LOCALLY LIST
31d90af7969f5003b27f68e27e7f2cb1 app.gz
Saya mencoba untuk membuat dua for's
untuk melakukan pengecekan, tapi aku memiliki beberapa masalah dalam berinteraksi melalui daftar di for
dengan bash
. Di bawah kode yang saya berikan di atas adalah:
for i in "$s3_list"
do
echo "$i"
echo "-----------"
done
Yang diberikan sebagai berikut output:
d41d8cd98f00b204e9800998ecf8427e
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
31d90af7969f5003b27f68e27e7f2cb1 app.gz
-----------
yang seharusnya berupa:
d41d8cd98f00b204e9800998ecf8427e
-----------
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
-----------
31d90af7969f5003b27f68e27e7f2cb1 app.gz
-----------
Yang berarti saya berinteraksi dengan garis satu per satu, tidak semuanya bersamaan seperti yang ditunjukkan di atas.
Apa yang saya lakukan (salah mengerti tentang bash) di sini?
Jawaban:
Variabel yang dikutip ganda (seperti
"$s3_list"
) diperlakukan sebagai argumen tunggal, tidak peduli apakah itu berisi spasi atau baris baru.Hanya dengan menjatuhkan tanda kutip ganda tidak akan menghasilkan hasil yang diinginkan juga, karena item sekarang akan dibagi dengan spasi juga. Untuk mengatasinya, atur pemisah file internal hanya ke baris baru:
sumber
OLDIFS=$IFS; IFS=$'\n'; set -f; for ... done; IFS=$OLDIFS; set +f
IFS
, terima kasih banyak!