我有一个包含多行的字符串。我想阅读每一行并用它做些什么。
filelist=<some function that runs ls -1 on multiple servers>
for file in $filelist
do
echo $file | do_something
done
不幸的是,它并没有把线分开。
如果我将filelist替换为$(ls -1)
,,则它可以工作。
尝试设置IFS:
IFS= ;x=$(ls -1) ; IFS=$'n' ;for i in $x ; do echo i=$i ; done
ls
并在变量周围使用引号。类似echo "$file" | do_something
那么,如果我们不能解析ls
,那么我们该如何解决呢?
好吧,这是一个常见的问题,所以在这里回答。
这里有一句话:
# Bash
unset a i
while IFS= read -r -d '' file; do
a[i++]="$file"
done < <(find /tmp -type f -print0)
前面的例子通过强制read使用NUL字节(\0)作为行分隔符,将/tmp下的所有文件(递归)读取到一个数组中,即使它们的名称中有换行符或其他空白。由于NUL在Unix文件名中不是有效的字节,因此这是除了使用find-exec之外最安全的方法。IFS=是避免修剪前导/尾随空白所必需的,-r是避免反斜杠处理所必需的。
我们不知道如何从服务器中检索文件列表,因此我无法进一步帮助您。但它应该很简单,你只需用find
替换ls
命令,就可以了。此外,你可能想看看man find
,看看如何阻止它递归地执行(如果你不想这样做的话)。