如何与 bash 交互?

如何与 bash 交互?

我知道这听起来一定是一个奇怪的问题,但对我来说,这个问题总是在 中发展CC++Java(现在在 中bash)似乎更奇怪。我试图检查两个列表(一个来自我的远程服务器,另一个来自我的本地服务器)中的md5filename是否匹配。这是我到目前为止所做的:

#!/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来进行检查,但是在通过 中的列表进行交互时遇到了一些问题forbash下面是我上面提供的代码:

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

相关内容