我想将所有参数从shell脚本传递到另一个命令,除非其中一个参数是--
,在这种情况下我想要在我的脚本中使用--
之前的参数,并仅在--
之后传递参数。
例如,如果我的脚本是foo.sh
:
./foo.sh -a bar -p qux -- --recursive -p 8080
我想在我的脚本中使用-a
和第一个-p
参数,然后传递--recursive
和第二个-p
。
我最初的想法是首先迭代每个参数,直到找到--
,然后使用shift
提取我想要的参数,然后将其余参数传递给另一个命令{{1}但是我希望有更优雅的方法来做到这一点。
作为旁注,我目前正在使用$@
来提取参数,因此使用该解决方案的解决方案将是最佳的。
答案 0 :(得分:6)
不确定这是您想要的,简化示例取自GNU manual。
#!/bin/bash
aflag=
bflag=
cflag=
dflag=
while getopts abcd name
do
case $name in
a) aflag=1;;
b) bflag=1;;
c) cflag=1;;
d) dflag=1;;
esac
done
shift $(($OPTIND - 1))
printf "Remaining arguments are: %s\n" "$*"
结果
$ ./test.sh -a -b -- -c -d
Remaining arguments are: -c -d
完整性手册的相关部分
每次调用它时,getopts实用程序都应将下一个选项的值放在由名称操作数指定的shell变量中,并将下一个参数的索引放在shell变量OPTIND中。每当调用shell时,OPTIND都应初始化为1。
[...]
当遇到选项结束时,getopts实用程序将以大于零的返回值退出; shell变量OPTIND应设置为第一个非选项参数的索引,其中第一个&#34; - &#34;如果在它之前没有出现其他非选项参数,则参数被认为是一个选项参数,或者值为#34; $#&#34;如果没有非选项参数,则为+1; name变量应设置为问号字符。以下任何一项都应标明选项的结尾:特殊选项&#34; - &#34;,查找不以&#39; - &#39;开头或遇到错误的参数。< / p>