1

Я знаю, что это звучит странно, но для меня то, что всегда разрабатывалось на C , C++ и Java (а теперь и на bash), кажется более странным. Я пытаюсь проверить, совпадают ли md5 и filename из двух списков (один с моего удаленного сервера и другой с моего локального сервера). Это то, что я сделал до сих пор:

#!/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";

Это даст мне следующий вывод:

S3 LIST
d41d8cd98f00b204e9800998ecf8427e 
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
31d90af7969f5003b27f68e27e7f2cb1 app.gz

LOCALLY LIST
31d90af7969f5003b27f68e27e7f2cb1 app.gz

Я пытаюсь создать два for's чтобы сделать проверку, но у меня возникают некоторые проблемы в взаимодействуют между собой по списку в for с bash Ниже код, который я предоставляю выше:

for i in "$s3_list"
do
  echo "$i"
  echo "-----------"
done

Который дает следующий вывод:

d41d8cd98f00b204e9800998ecf8427e 
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
31d90af7969f5003b27f68e27e7f2cb1 app.gz
-----------

что это должно быть что-то вроде:

d41d8cd98f00b204e9800998ecf8427e 
-----------
41eae9b40d23de2f02bf07635870f6d0 app.20121117040001.gz
-----------
31d90af7969f5003b27f68e27e7f2cb1 app.gz
-----------

Это означает, что я взаимодействую со строками одна за другой, а не все вместе, как показано выше.

Что я здесь делаю (неправильно понимаю bash)?

1 ответ1

4

Переменная с двойными кавычками (например, "$s3_list") обрабатывается как один аргумент, независимо от того, содержит ли он пробелы или переводы строки.

Простое отбрасывание двойных кавычек также не приведет к желаемому результату, поскольку элементы теперь будут также разделяться пробелами. Чтобы преодолеть это, установите внутренний разделитель файлов только на новую строку :

IFS=$'\n'

for i in $s3_list
   ...
done

unset IFS

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .