Bash 如何访问前面的文本通配符参数';是否扩展到匹配的文件? 背景:
我正在编写一个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
./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
问题:
- 我如何避免这种情况
- 如何验证目标文件夹是作为参数显式传递的,而不是第二个参数中通配符扩展的产物
- 但我如何知道最后一个参数是显式通过的,还是该产品是通配符扩展
- 重新排列参数,使变长参数排在最后
- 使用命令行标志,如--dest/-d dest_DIR
- 您的脚本无法知道,因为它是由shell传递参数的,并且它不知道调用进程的状态。为什么不呢
这将与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参数。但我如何知道最后一个参数是显式传递的,还是该产品是一个通配符扩展。