背景:
我正在编写一个必须接收这些参数的 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
通过是因为通配符返回了多个项目,并且如果恰好存在与通配符匹配的文件夹,例如this_is_a_folder.data
,那么展开是这样的:
myscript file.conf this.data that.data so.data this_is_a_folder.data
该脚本将工作,但以非预期的方式......它将处理this.data, that.data and so.data
文件的处理版本并将其放入文件夹中this_is_a_folder.data
。
问题
- 我该如何避免呢?
- 如何验证目标文件夹是作为参数显式传递的,而不是第二个参数中通配符扩展的产物?
在将文字“* .data”参数扩展为匹配的文件名之前,我找不到读取文字的方法。
澄清:
我知道如何阅读最后一个论点。
- 但是我怎么知道最后一个参数是明确通过还是产品是通配符扩展?