for循环中的Bash变量

时间:2016-03-17 15:14:09

标签: bash

我确信之前已经回答过,但我找不到解决办法。

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循环?

2 个答案:

答案 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)