Tul*_*ova 4 parameters bash arguments command-line-arguments
我正在编写一个必须接收以下参数的bash脚本:
理论上有3个参数,但实际上第二个参数会扩展,因此如果通配符匹配多个文件,则参数的实际数量会有所不同:
当我打电话
./myscript file.conf *.data dest_foder
Run Code Online (Sandbox Code Playgroud)
*.data 扩展为与通配符匹配的文件数量,因此等效于:
myscript file.conf this.data that.data so.data dest_foder
Run Code Online (Sandbox Code Playgroud)
在处理之前,我需要验证最后一个参数是文件夹而不是文件。
如果我省略目标文件夹,例如:
myscript file.conf *.data
Run Code Online (Sandbox Code Playgroud)
验证?# -ge 3通过是因为通配符返回多个项目,并且如果存在与通配符匹配的文件夹(例如)this_is_a_folder.data,则扩展如下所示:
myscript file.conf this.data that.data so.data this_is_a_folder.data
Run Code Online (Sandbox Code Playgroud)
该脚本将运行,但是会以一种非预期的方式...它将this.data, that.data and so.data处理文件的已处理版本并将其放置在folder中this_is_a_folder.data。
在将原义“ * .data”参数扩展为匹配的文件名之前,我无法找到一种方法。
我知道如何阅读最后一个论点。
您无法执行此操作,因为Shell甚至在脚本启动之前都会在命令行中扩展任何通配符。当您输入./myscript file.conf *.data dest_foder外壳程序时,这实际上只是的简写./myscript file.conf this.data that.data so.data dest_foder,而不是其他命令。
如果需要将通配符作为实际参数传递给命令,则需要引用或转义该通配符。像./myscript file.conf '*.data' dest_foder或./myscript file.conf \*.data dest_foder。或者,将最后一个参数设为必需,或将其变为选项(-d dest_folder),这样预扩展的文件列表就不成问题。
换句话说,如果您不必在grep模式中引用/转义通配符,这将非常方便;但您必须这样做,因为该grep命令无法以未扩展的形式获取其参数。而且,如果的作者grep无法弄清楚如何使他们的命令更方便,那么您将不可能做到这一点……