我有一个包含多行的字符串。我想阅读每一行并用它做点什么。
filelist=<some function that runs ls -1 on multiple servers>
for file in $filelist
do
echo $file | do_something
done
不幸的是,它没有分隔线。
如果我将文件列表替换为$(ls -1)
,则可以。
答案 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
以了解如何阻止它以递归方式执行(如果您不希望这样做)。