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*
是最好的主意-你应该把它移到你答案的顶部,然后我将删除我的答案。