for循环中的Bash变量

for循环中的Bash变量,bash,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循环(for I in$z)中使用

我相信这个问题以前已经得到了回答,但我找不到解决办法

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循环(
for I in$z
)中使用一个变量(这里是


我试图更清楚地说明我的问题:我需要如何定义我的变量(如果我想用一个或多个管道在命令的输出上循环)以及对for循环的调用如何?

要循环通过以
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


另一个好的做法是使用subshell而不是backticks,后者可读性更高并且可以嵌套,使用它:
$(ls | grep^t)
要循环遍历以
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


另一个好的做法是使用subshell而不是backticks,后者可读性更高,并且可以嵌套,请使用以下命令:
$(ls | grep^t)

您不需要为此使用变量。您不能将命令放入字符串中。有关原因的讨论,请参阅

无论如何,您不应该使用
for
循环逐行读取数据。看看有没有更好的方法

具体地说(尽管确实读过那一页):

而IFS=read-r行;做
printf'%s\n'$行

完成<此操作不使用变量。您不能将命令放入字符串中。有关原因的讨论,请参阅

无论如何,您不应该使用
for
循环逐行读取数据。看看有没有更好的方法

具体地说(尽管确实读过那一页):

而IFS=read-r行;做
printf'%s\n'$行

done<你应该写
z=`ls | grep^t`
@PatrickTrentin语法正确,但你不应该使用它。@chepner fair;埃塔:没关系,我自己看的。(:@chepner我回答了
z=`ls | grep^t`for I in“$z”;do echo$I;done
z=“$(ls | grep^t)”;for I in“$z”;do echo$i;done
我得到了
-3
你知道为什么吗?请给我一些建议。@terces907因为不好。你应该写
z=`ls | grep^t`
@PatrickTrentin语法正确,但你不应该使用它。@chepner很公平;埃塔:没关系,我自己看的。(:@chepner我回答了
z=`ls | grep^t`for I in“$z”;do echo$I;done
z=“$(ls | grep^t)”;for I in“$z”;do echo$i;done
我得到了
-3
你知道为什么吗?请给我一些建议。@terces907因为不好。我只看了你答案的第一部分,这就是我发布自己答案的原因。你建议使用
t*
是最好的主意-你应该把它移到你答案的顶部,然后我会删除我的答案。我只看了你答案的第一部分你的答案,这就是我发布我自己的答案的原因。你建议使用
t*
是最好的主意-你应该把它移到你答案的顶部,然后我将删除我的答案。