将分隔符后的所有参数传递给另一个命令

时间:2016-06-29 03:22:56

标签: bash shell unix

我想将所有参数从shell脚本传递到另一个命令,除非其中一个参数是--,在这种情况下我想要在我的脚本中使用--之前的参数,并仅在--之后传递参数。

例如,如果我的脚本是foo.sh

./foo.sh -a bar -p qux -- --recursive -p 8080

我想在我的脚本中使用-a和第一个-p参数,然后传递--recursive和第二个-p

我最初的想法是首先迭代每个参数,直到找到--,然后使用shift提取我想要的参数,然后将其余参数传递给另一个命令{{1}但是我希望有更优雅的方法来做到这一点。

作为旁注,我目前正在使用$@来提取参数,因此使用该解决方案的解决方案将是最佳的。

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>