我确信之前已经回答过,但我找不到解决办法。
for i in `ls | grep ^t`; do echo $i; done
这给了我预期的结果(以t开头的文件和目录)。 如果我想在for循环中使用shell变量(使用管道),我该怎么做? 这是我的开始,但它不起作用。
z="ls | grep ^t"
for i in `$z` ; do echo $i; done
编辑:我同意这个例子并没有明智地选择,但我基本上需要在for循环($z
)中使用一个至少有一个管道的变量(这里是for i in $z
)。
我试着更清楚地说明我的问题:我如何定义我的变量(如果我想用一个或多个管道循环一个命令的输出)以及如何调用for循环?
答案 0 :(得分:4)
要循环浏览以t
开头的所有文件,您应该使用glob
扩展而不是解析ls
输出:
$ ls t*
tf tfile
$ ls
abcd tf tfile
$ for i in t*; do echo "$i"; done
tf
tfile
$
您的方法会在许多情况下中断,最简单的方法是文件名包含空格。这里不需要使用任何外部工具; t *扩展为以t。
开头的所有文件至于您的问题,请使用ls | grep ^t
另一个好的做法是使用子shell而不是反引号,它们更易读并且可以嵌套,使用它:$(ls | grep ^t)
答案 1 :(得分:0)
你没有使用变量。你不要把命令放在字符串中。有关原因的讨论,请参阅Bash FAQ 050。
您无论如何都不应该使用for
循环来逐行读取数据。有关更好的方法,请参阅Bash FAR 001。
具体(虽然真的读过那页):
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(some command)