Como interagir com o bash?

1

Eu sei que isso deve ser uma pergunta estranha, mas para mim, sempre desenvolvido em C , C++ e Java (e agora em bash ) parece mais difícil. Eu estou tentando verificar se md5 e filename de duas lista (um do meu servidor remoto e outro do meu servidor local) corresponde. Foi o que eu fiz até agora:

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

Isso me dá a seguinte saída:

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

LOCALLY LIST
31d90af7969f5003b27f68e27e7f2cb1 app.gz

Estou tentando criar dois for's para fazer a verificação, mas estou tendo algum problema em interagir pela lista em for com bash . Abaixo do código que eu forneci acima está:

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

Qual é a seguinte saída:

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

qual deve ser algo como:

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

O que significa que estou interagindo com as linhas uma por uma, não todas juntas, como mostra acima.

O que estou fazendo (entendendo errado sobre o bash) aqui?

    
por Valter Silva 23.05.2013 / 16:26

1 resposta

4

Uma variável com aspas duplas (como "$s3_list" ) é tratada como um único argumento, independentemente de conter espaços ou novas linhas.

Apenas descartar as aspas duplas também não produzirá o resultado desejado, pois os itens agora também serão divididos por espaços. Para superar isso, defina o separador de arquivos internos somente para nova linha:

IFS=$'\n'

for i in $s3_list
   ...
done

unset IFS
    
por 23.05.2013 / 16:38