我是shell脚本的新手。如果我的怀疑太愚蠢请原谅我
我在2个不同的目录和一个可执行文件中的PNG图像,它从每个目录中获取图像并处理它们以生成新图像。
我正在寻找一个for循环结构,它可以同时接受两个变量..这在C,C++等中是可能的,但我如何完成以下内容。代码显然是错误的。
#!/bin/sh
im1_dir=~/prev1/*.png
im2_dir=~/prev3/*.png
index=0
for i,j in $im1_dir $im2_dir # i iterates in im1_dir and j iterates in im2_dir
do
run_black.sh $i $j
done
谢谢!
8条答案
按热度按时间h79rfbju1#
如果您依赖于两个目录来匹配基于区域设置排序的顺序(就像您的尝试),那么数组应该可以工作。
c90pui9n2#
这里有一些额外的方法来做你正在寻找的关于利弊的笔记。
以下仅适用于不包含换行符的文件名。它会同步配对文件。它使用一个额外的文件描述符来读取第一个列表。如果
im1_dir
包含更多的文件,当im2_dir
用完时,循环将停止。如果im2_dir
包含更多文件,则对于所有不匹配的file2
,file1
将为空。当然,如果它们包含相同数量的文件,就没有问题。你可以让行为保持一致,这样循环就只会在匹配到非空的文件时停止,而不管哪个列表更长,方法是用双&符号替换分号,如下所示:
此版本使用
for
循环而不是while
循环。当两个列表中较短的一个用完时,这个列表停止。这个版本与上面的版本类似,但是如果其中一个列表用完了,它会循环使用这些项,直到另一个列表用完。这是非常丑陋的,你可以用另一种更简单的方式来做同样的事情。
这个版本只对内部循环(第二个目录)使用数组。它只会执行与第一个目录中的文件一样多的次数。
dzhpxtsq3#
如果你不介意偏离常规路径(bash),工具命令语言(Tool Command Language,TCL)有这样一个循环结构:
基本上,该循环读为:* 对于取自列表1的每个项目1和取自列表2的项目2 *。然后,您可以使用自己的命令替换
command_name
。wlsrxk514#
另一个解决方案。两个带有文件名的列表粘贴到一个列表中。
a2mppw5e5#
这可能是在同一个循环中使用两个变量的另一种方法。但是,您需要知道目录中的文件总数(或者,您想要运行循环的次数),才能将其用作迭代
i
的值。获取目录中的文件数:
现在运行循环:
如需更多帮助,请参阅此discussion。
dddzy1tm6#
我有这个问题的一个类似的情况下,我想要一个顶部和底部范围同时。这是我的解决办法;它不是特别有效,但它很简单、干净,对于讨厌的BASH数组和所有废话来说一点也不复杂。
atmip9wb7#
在这个问题中,你可以使用两个for循环函数。
h43kikqp8#
可以使用
${!array[@]}
语法对array
的索引进行迭代来进一步简化已接受的答案: