for循环迭代字符串中的行

时间:2014-01-15 21:55:24

标签: bash

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

filelist=<some function that runs ls -1 on multiple servers> 
for file in $filelist
do
        echo $file | do_something
done

不幸的是,它没有分隔线。

如果我将文件列表替换为$(ls -1)则可以

2 个答案:

答案 0 :(得分:0)

尝试设置IFS:

IFS= ;x=$(ls -1) ;  IFS=$'\n' ;for i in $x ; do echo i=$i ; done

答案 1 :(得分:0)

Don't parse ls并在变量周围使用引号。与echo "$file" | do_something

一样

那么,如果我们无法解析ls,那么我们如何解决呢?

嗯,这是一个常见的问题,所以答案为here

以下是它的引用:

# Bash
unset a i
while IFS= read -r -d '' file; do
    a[i++]="$file"
done < <(find /tmp -type f -print0)
  

前面的示例将/ tmp(递归地)下的所有文件读入一个数组,即使它们的名称中有换行符或其他空格,也强制读取使用NUL字节(\ 0)作为其行分隔符。由于NUL不是Unix文件名中的有效字节,因此除了使用find -exec之外,这是最安全的方法。需要IFS =以避免修剪前导/尾随空格,并且需要使用-r来避免反斜杠处理。

我们不知道您如何从服务器检索文件列表,所以我无法帮助您。但它应该很简单,你只需用ls替换你的find命令就可以了。另外,您可能需要查看man find以了解如何阻止它以递归方式执行(如果您不希望这样做)。