在扩展到匹配文件之前如何访问原义通配符?

Tul*_*ova 4 parameters bash arguments command-line-arguments

背景:

我正在编写一个必须接收以下参数的bash脚本:

  1. 文件名(包含一组规则的文件)
  2. 文件名列表(要处理的文件,可以使用通配符)
  3. 目标文件夹(将存储文件的经过处理的版本)

理论上有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”参数扩展为匹配的文件名之前,我无法找到一种方法。

澄清:

我知道如何阅读最后一个论点。

  • 但是我如何知道最后一个参数是否被明确传递,或者该产品是通配符扩展?

Gor*_*son 5

您无法执行此操作,因为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无法弄清楚如何使他们的命令更方便,那么您将不可能做到这一点……