for循环在字符串中的行上迭代



我有一个包含多行的字符串。我想阅读每一行并用它做些什么。

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,看看如何阻止它递归地执行(如果你不想这样做的话)。

相关内容

  • 没有找到相关文章

最新更新