Bash 如何访问前面的文本通配符参数';是否扩展到匹配的文件? 背景:

Bash 如何访问前面的文本通配符参数';是否扩展到匹配的文件? 背景:,bash,parameters,arguments,command-line-arguments,Bash,Parameters,Arguments,Command Line Arguments,我正在编写一个bash脚本,它必须接收以下参数: 文件名(包含一组规则的文件) 文件名列表(要处理的文件,可以使用通配符) 目标文件夹(将在其中存储文件的已处理版本) 理论上有3个参数,但实际上第二个参数会扩展,因此,如果通配符匹配多个文件,则实数参数会有所不同: 当我打电话时 ./myscript file.conf *.data dest_foder *.data扩展为与通配符匹配的任意多个文件,因此它等效于: myscript file.conf this.data that.data

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

  • 文件名(包含一组规则的文件)
  • 文件名列表(要处理的文件,可以使用通配符)
  • 目标文件夹(将在其中存储文件的已处理版本)
  • 理论上有3个参数,但实际上第二个参数会扩展,因此,如果通配符匹配多个文件,则实数参数会有所不同:

    当我打电话时

    ./myscript  file.conf *.data dest_foder
    
    *.data
    扩展为与通配符匹配的任意多个文件,因此它等效于:

    myscript file.conf this.data that.data so.data dest_foder
    
    在处理之前,我需要验证最后一个参数是文件夹而不是文件。

    问题 如果我打开目标文件夹,如:

    myscript file.conf *.data
    
    验证
    ?#-ge 3
    通过,因为通配符返回多个项目,如果与通配符匹配的文件夹碰巧存在,如
    此文件夹为文件夹。数据
    ,则展开如下:

    myscript file.conf this.data that.data so.data this_is_a_folder.data
    
    该脚本将工作,但在一个非预期的方式。。。它将处理
    this.data、that.data和so.data
    并将文件的处理版本放入文件夹
    this\u is\u文件夹.data

    问题:
    • 我如何避免这种情况
    • 如何验证目标文件夹是作为参数显式传递的,而不是第二个参数中通配符扩展的产物
    在将文本“*.data”参数扩展为匹配的文件名之前,我找不到读取该参数的方法

    澄清: 我知道怎么读最后一个论点

    • 但我如何知道最后一个参数是显式通过的,还是该产品是通配符扩展

      • 您的脚本无法知道,因为它是由shell传递参数的,并且它不知道调用进程的状态。为什么不呢

      • 重新排列参数,使变长参数排在最后
      • 使用命令行标志,如--dest/-d dest_DIR

      • 这将与UNIX工具约定更加一致。

        您不能这样做,因为shell甚至在脚本启动之前就在命令行中展开任何通配符。当您在shell中输入
        /myscript file.conf*.data dest_foder
        时,这实际上只是
        /myscript file.conf this.data that.data so.data dest_foder
        的简写,而不是另一个命令

        如果需要将通配符作为实际参数传递到命令中,则需要引用或转义它。类似于
        /myscript file.conf'*.data'dest\u foder
        /myscript file.conf\*.data dest\u foder
        。或者,强制最后一个参数,或者将其转换为选项(
        -d dest_folder
        ),这样预扩展的文件列表就不会有问题


        换句话说:如果您不必在grep模式中引用/转义通配符,这将非常方便;但是您必须这样做,因为
        grep
        命令无法以未展开的形式获取其参数。如果
        grep
        的作者不知道如何使他们的命令更方便,你就无法做到这一点……

        如果使用BASH>=3.0,请尝试
        ${BASH_ARGV[0]}
        获取最后一个参数。@Yang我知道如何读取las参数。但我如何知道最后一个参数是显式传递的,还是该产品是一个通配符扩展。