![如何循环遍历变量](https://linux22.com/image/101136/%E5%A6%82%E4%BD%95%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%8F%98%E9%87%8F.png)
我的 csh 脚本中有一个命令可以提供至少 2 行输出,但可能更多。我将这些行转换为单独的变量,然后将其传递给另一个命令。如何将第二个命令设置为循环并运行命令 1 输出的每个变量?下面是我将命令 1 的输出转换为变量的内容。
set vars = `echo "command 1"`
set numRows = $#vars
if ($numRows < 2) then
echo "ERROR! $numRows rows!"
exit
endif
`echo '/command2 -L '$vars[1]'`
答案1
注意,我使用的是 bash,而不是 csh,因为我不讨厌自己。但你可以在 csh 中完成所有这些,你只需要翻译即可。如果您想在 bash 中工作,只需先运行“bash --login”,然后您就可以在 bash 中工作。
为了完成您在 shell 脚本中描述的那种任务,我们使用管道而不是像在编程语言中那样使用循环。别误会我的意思,那里是csh 和 bash 中的循环结构,但对于您所描述的,我们采用不同的方式。
如果我有一个命令可以生成多行输出,并且我希望另一个命令一次对这些行执行一行操作,那么我会使用管道 | 连接这两个命令。 ,也许像这样:
猫文件.txt | grep“一些单词”
grep 命令处理来自 STDIN 的每一行,该行通过管道链接到 cat 命令的 STDOUT。这是一个微不足道的例子,但它很有用。
其他:
echo '一、二、三' | tr ',' '\n'
这将用换行符替换所有逗号,从一行输入创建三行输出。
如果我想为目录中所有文件的名称添加扩展名,我可能会这样做:
cd directory
for filename in *
do
mv ${filename} ${filename}.extension
done
* 是文件通配模式。文件通配是指命令行上的模式被替换为当前目录中与通配模式匹配的任何文件名。 * 表示“任何东西”