将文件名作为参数传递给函数的脚本[重复]
Posted
技术标签:
【中文标题】将文件名作为参数传递给函数的脚本[重复]【英文标题】:Script that pass file names as arguments to function [duplicate] 【发布时间】:2017-08-04 22:31:05 【问题描述】:我有一个名为 threshold 的程序。我在一个名为 images 的目录中有一组图像。
|-- images
| -----img_1.jpg
| -----img_2.jpg
| -----img_3.jpg
| ------
| ------img_n.jpeg
|-- threshold.exe
|-- myscript
如何编写 bash 脚本,使其接受目录名作为参数,并将目录中的每个文件作为参数单独传递给程序 threshold.exe。
如果我执行,
$./myscript images
最后的执行应该是这样的。
./threshold.exe img_1.jpg
./threshold.exe img_2.jpg
....
....
./threshold.exe img_n.jpg
【问题讨论】:
你自己尝试了什么/ 运行时,您的批处理文件将为您提供“内部”变量。假设一个批处理文件“DoIt.bat”。像doit.bat "c:\folder path\to\wherever"
这样的调用会将 "c:\folder path\to\wherever"
参数停放在变量 %1 中。因此,您将查询 %1 的文件列表并将每个文件传递给threshold @file
。 ForFiles / Batch parameters 玩得开心。试试看,发布您的代码,我们将帮助您走得更远。不过,您在 Windows 中吗?
类似 'for %%i in (path to directory \ *.jpg) do threshold.exe %%i' 我猜这应该可行..
顺便说一句,./threshold img_1.jpg
不起作用,因为threshold
位于父目录中,而不是当前目录中。您想要./threshold images/img_1.jpg
或与../threshold img_1.jpg
等效的名称。
未来,顺便说一句,试着关注***.com/help/mcve -- 发布一个问题,不仅描述你想做什么,还描述你尝试了什么,它是如何失败的,以及 导致相同故障的最短代码量,其构造使得其他人(不仅仅是您)可以运行它并看到相同的结果。
【参考方案1】:
假设您在 Windows 环境中。
forfiles /p %1 /m *.jpg /c "cmd /c threshold.exe @file"
-对于路径中的每个文件 (/p
) %1
-其中 %1 是传递的参数,也就是您要搜索的文件夹
-运行命令(/c
)cmd /c threshold.exe @file
-其中@file
代表jpg文件的路径
【讨论】:
鉴于 OP 提出的是“bash”问题而不是“batch”问题,并使用./
启动他们的程序,这看起来不是一个安全的假设。
(...虽然.exe
扩展名有点冲突,但这不是一个确定的事情——在您的Unixen 上使用Mono 运行的CLR 可执行文件或使用Wine 运行的PE 文件通常仍然安装有扩展名完好无损)。
@CharlesDuffy,基于相同的队列,我也很确定他没有运行 Windows。希望这些信息仍然可以帮助他或正在寻找类似答案的人。【参考方案2】:
#!/bin/bash
for dir; do
for f in "$dir"/*; do
./threshold.exe "$f"
done
done
这表现如下:
首先,迭代命令行参数,将每个参数视为一个目录 接下来,遍历当前目录中的文件 然后,为每个文件调用您的可执行文件请注意,这将是./threshold.exe images/img_1.jpg
的形式,而不是./threshold img_1.jpg
的形式——这是必要的,以便我们从实际包含 @ 的目录中运行./threshold.exe
987654325@,并且仍然为您的文件提供有效的相对路径。
【讨论】:
以上是关于将文件名作为参数传递给函数的脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章