我有一个 (bash) shell script myBaseScript.sh,具有以下签名:
myBaseScript.sh [OPTIONS] FILE1 [FILE2 ...]
该脚本myBaseScript.sh通过 解析选项getopts,如下所示:
while getopts ":hi:m:s:t:v:" opt; do
#...
done
shift $(($OPTIND-1))
FILES=("$@")
现在我希望创建一个脚本mySuperScript.sh,它调用myBaseScript.sh,允许将选项转发到基本脚本:
mySuperScript.sh [OPTIONS] DIR1 [DIR2 ...]
中[OPTIONS]使用的选项在哪里myBaseScript.sh;它们不用于mySuperScript.sh.
该脚本mySuperScript.sh将爬取所有目录DIR1,[DIR2]等等,编译一个有效文件列表,${FILES[@]}然后传递给myBaseScript.sh.
现在我有这个mySuperScript.sh:
myBaseScript.sh "$@" "${FILES[@]}"
where${FILES[@]}是当前路径中的文件列表。换句话说,这允许
mySuperScript.sh [OPTIONS]
但不适用于任何可选DIR1的 ,[DIR2]等。
我可以使用
allOpts=("$@")
while getopts ":hi:m:s:t:v:" opt; do echo. > /dev/null; done
shift $(($OPTIND-1))
DIRS=("$@")
然后传递as to的第一个$OPTIND条目。但这似乎过于复杂,而且需要将有效选项列表复制到,这是管理上的噩梦。$allOpts[OPTIONS]myBaseScript.shmyBaseScript.sh
我还可以创建一个新脚本,专门用于解析这些选项。但这似乎也有点尴尬,因为它产生了一种myBaseScript.sh以前不存在的依赖关系......
那么,最干净的方法是什么?