我知道这听起来一定是一个奇怪的问题,但对我来说,这个问题总是在 中发展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
双引号变量(例如"$s3_list"
)被视为单个参数,无论它是否包含空格或换行符。
仅删除双引号也不会产生所需的结果,因为项目现在也会被空格分隔。为了解决这个问题,请设置内部文件分隔符仅限换行:
IFS=$'\n'
for i in $s3_list
...
done
unset IFS