2016-06-29 38 views
2

我想在所有參數傳遞從一個shell腳本到另一個命令除非的論據之一是--,在這種情況下,我想--前使用的參數在我的腳本中,並且僅在--之後傳遞參數。通過所有參數的分隔符後,另一個命令

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

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

我想用-a和第一-p參數在我的劇本,並通過對--recursive和第二-p

我最初的想法是第一疊代的每個參數,直到--被發現,然後使用shift提取我想要的參數,然後剩下的用[email protected]傳遞給其他命令,但我希望有一個更優雅的方式來做到這一點。

作爲一個方面說明,我目前使用getopts提取參數,使之與一個可行的解決方案是最優的。

回答

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 

爲completness

每次調用時間手冊的相關部分,getopts的效用應放置於下一個選項的值由名稱操作數指定的shell變量以及要在shell變量OPTIND中處理的下一個參數的索引。每當外殼被調用時,OPTIND將被初始化爲1

[...]

當遇到選項結束時,getopts的工具應返回值大於零退出; shell變量OPTIND將被設置爲第一個非選項參數,其中第一個索引「 - 」的說法被認爲是如果沒有其他前出現非選項參數是一個選項參數,或如果沒有非選項參數,則值「$#」+1; name變量應設置爲問號字符。以下任何一項都應標識選項的結尾:特殊選項「 - 」,查找不以「 - 」開頭或遇到錯誤的參數。

+0

完善,這個工程幾乎完全一樣我想要的。如果不傳遞'--',它就不能正常工作,但是如果參數列表中存在'--',我只需運行'getopts'循環就可以解決這個問題。謝謝! –