所以我的脚本看起来像这样:
#...
files="$(find $line/processed/* 2>/dev/null)" #2>/dev/null used for error output suppression
if [[ ! -z "$files" ]]
then
#put_list="put"
#for word in $files; do
# put_list="$put_list"$' '"$word"
#done
put_list="put $files"
rm_list="rm $files"
yafc ftp://[email protected] <<**
$put_list
close
quit
**
#...
因此,如果我像这样使用它,我会从 yafc 收到如下错误:
...
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,25,,313', try 'help'
yafc 192.168.178.54:~/> No such command '/mnt/dir/processed/19,11,2014-14,17,41,,649"
...
每个文件都列在这里。只有第一个文件$files
被放置在主机上。
但是如果我使用这个:(上面代码中注释掉的内容)
put_list="put"
for word in $files; do
put_list="$put_list"$' '"$word"
done
一切都很完美!那么区别是什么呢?我试图用它tr
来摆脱'\n'
.如果我echo $put_list
,在这两种情况下它们(似乎)是相同的。我不想迭代 $files 因为有时其中有很多数据,并且会花费很多时间。
那么,是否可以在没有这种昂贵的 for 循环的情况下完成这项工作呢?
答案1
files=$(echo $line/processed/*)
yafc ftp://[email protected] <<**
put $files
close
quit
**
该find
命令用换行符分隔找到的文件(每行一个文件)。由于您实际上似乎不需要可以使用的查找功能files=$(echo $line/processed/*)
。
这里的文档扩展为
put file1
file2
file3
...
当您尝试循环时,您没有使用引号,因此换行符被解释为字段分隔符,因此每个文件都由您添加的空格分隔。
通过使用简单的files=$(echo $line/processed/*)
$files
现在,文件之间只有空格,因此put $files
应该执行您想要的操作。