如何在Linux的终端中循环执行可执行命令?

Lin*_*les 14 linux file-io loops

让我先描述一下我的情况,我正在开发一个Linux平台,并且有一组.bmp文件可以将图片编号中的一个添加到filename0022.bmp最多filename0680.bmp.共有658张图片.我希望能够通过在图片上运行的.exe文件运行这些图片然后将文件踢出到用户指定的文件,它还有一些阈值参数:lower,upper.因此,对可执行文件的典型调用是:

./filter inputfile outputfile lower upper
Run Code Online (Sandbox Code Playgroud)

有没有办法可以通过终端或通过创建某种bash脚本来循环调用所有文件?我的问题与此类似:使用批处理文件对多个文件执行命令,但这次我在Linux命令行终端中工作.

Ste*_*nas 15

您可能有兴趣研究bash脚本.

您可以直接从shell执行for循环中的命令.

一个简单的循环来生成您特别提到的数字.例如,从shell:

user@machine $ for i in {22..680} ; do
> echo "filename${i}.bmp"
> done
Run Code Online (Sandbox Code Playgroud)

这会给你从列表中filename22.bmpfilename680.bmp.这只是处理你提到的范围的迭代.这不包括零填充数.要做到这一点,你可以使用printf.该printf语法printf format argument.我们可以使用$i前一个循环中的变量作为参数,并应用%WdW是宽度的格式.前缀W占位符将指定要使用的字符.例:

user@machine $ for i in {22..680} ; do
> echo "filename$(printf '%04d' $i).bmp"
> done
Run Code Online (Sandbox Code Playgroud)

在上述$()作为变量的行为中,执行命令以获得与预定义值相对的值.

现在应该为您提供您指定的文件名.我们可以将其应用到实际应用中:

user@machine $ for i in {22..680} ; do
> ./filter "filename$(printf '%04d' $i).bmp" lower upper
> done
Run Code Online (Sandbox Code Playgroud)

这可以重写为一行:

user@machine $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done
Run Code Online (Sandbox Code Playgroud)

从问题中要注意的一点是,.exe文件通常以COFFlinux期望ELF格式可执行的格式编译.


vis*_*hal 10

这是一个简单的例子:

for i in {1..100}; do echo "Hello Linux Terminal"; done
Run Code Online (Sandbox Code Playgroud)

附加到文件:( >>用于追加,你也可以使用>覆盖)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done
Run Code Online (Sandbox Code Playgroud)


sco*_*yaz 8

你可以试试这样的......

#! /bin/bash
for ((a=022; a <= 658 ; a++))
do
   printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh"
done
Run Code Online (Sandbox Code Playgroud)