Bagaimana cara berinteraksi dengan bash?

1

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 md5dan filenamedari 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'suntuk melakukan pengecekan, tapi aku memiliki beberapa masalah dalam berinteraksi melalui daftar di fordengan 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?

Valter Silva
sumber
1
Saya minta maaf bahwa saya sedang menuju keluar dan tidak punya waktu untuk mendapatkan jawaban Anda, tetapi saya rasa saya melihat masalahnya. Ketika Anda membuat daftar s3, Anda membuatnya dengan output dari perintah Anda. Tapi itu tidak membuatnya menjadi array, atau objek yang dapat diulang. Jadi sejauh yang diketahui, ada satu item di objek, bukan 3 (seperti yang Anda harapkan saat ini). Kelihatannya memang demikian, tapi saya akan keluar - jadi mudah-mudahan ada orang lain yang akan membantu Anda lebih jauh (atau mungkin itu membawa Anda ke jalur yang benar).
nerdwaller
@nerdwaller, Tidak masalah Bung, terima kasih atas komentar Anda, sekarang saya mengerti apa yang salah, dengan komentar Anda dan jawaban yang dipilih.
Valter Silva

Jawaban:

4

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:

IFS=$'\n'

for i in $s3_list
   ...
done

unset IFS
Dennis
sumber
2
OLDIFS=$IFS; IFS=$'\n'; set -f; for ... done; IFS=$OLDIFS; set +f
Uwe
Terima kasih Pak! Saya tidak tahu tentang penggunaan IFS, terima kasih banyak!
Valter Silva