2013-06-03 47 views
2

我想提出一個腳本,你可以給幾個參數吧:猛砸在getopts的多種組合

while getopts ":a:b:c:" opt; do 
    case $opt in 
    a) 
     echo "-a was triggered 
     ;; 
    b) 
     echo "-b was triggered 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

我現在有代碼工作,但我的問題是,我想給另一個函數/回聲如果它合併。

例子: 當我這樣做:.MyScript -AB比它應該給什麼是定義的另一個功能 「A」 或 「B」

所以有點像:

ab) -> Script -a -b or Script -ab 
echo "-ab was triggered" 

什麼是最好的解決方案呢? 任何想法,你可以免費發佈!

+0

這不會運行,因爲每個arg都需要額外的參數(例如'-a file -b file2')。如果沒有額外的參數,請不要在該字母后加':'! – TrueY

+0

我建議你不要混合原始的一個字母結束擴展(多個字母)的參數。使用'--ab'而不是'-ab'。 – TrueY

+0

是的,但我的問題是,我怎麼把我的情況下的多種解決方案? – user2252399

回答

1
while getopts ":a:b:c:" opt; do 
    case $opt in 
    a) 
     echo "-a was triggered" 
     a_val=$OPTARG 
     ;; 
    b) 
     echo "-b was triggered" 
     b_val=$OPTARG 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 
if [[ -n $a_val ]]; then do something with "$a_val"; fi 
if [[ -n $b_val ]]; then do something with "$b_val"; fi 

這可能會導致混亂的唯一情況是,如果用戶通過-a "" - 一個解決方法是:

a=false 
b=false 
while getopts ":a:b:c:" opt; do 
    case $opt in 
    a) echo "-a was triggered"; a_val=$OPTARG; a=true ;; 
    b) echo "-b was triggered"; b_val=$OPTARG; b=true ;; 
    esac 
done 
if $a; then do something with "$a_val"; fi 
if $b; then do something with "$b_val"; fi 

這裏,沒有括號:if $a; then ...因爲我調用命令 「真」還是「假」,並按照退出狀態行事。

1

修訂

可以使用getopt(1) Linux工具。這不是內部函數,但是它可以處理長參數。

嘗試這種情況:

declare -A OPTARG 
GetOpt() { 
    local prog="${BASH_SOURCE[0]}" 
    [ $# -eq 0 ] && echo "$prog: Bad call of GetOpts">&2 && exit 1 
    local longopt="$1" 
    shift 

    local tmp 
    tmp=$(getopt -n"$prog" -a -l "$longopt" -- '' "[email protected]") || exit 
    eval "tmp=($tmp)" 

    local i 
    for((i=0;i<${#tmp[*]};++i)){ 
    key=${tmp[i]#--} 
    [ -z "$key" ] && break 
    if [[ "${tmp[i+1]}" =~ ^-- ]]; then OPTARG[$key]=1 
    else OPTARG[$key]="${tmp[++i]}" 
    fi 
    } 
    for((j=0;++i<${#tmp[*]};++j)){ OPTFILE[j]=${tmp[i]};} 
} 

GetOpt "a b ab file:" "[email protected]" 

[ "${OPTARG[a]}" -a "${OPTARG[b]}" ] && OPTARG[ab]=1 && unset OPTARG[a] OPTARG[b] 

[ "${OPTARG[a]}" ] && echo Do a 
[ "${OPTARG[b]}" ] && echo Do b 
[ "${OPTARG[ab]}" ] && echo Do ab 

定義的GetOpt函數將放置與檢查長選項關聯數組所解析的命令行參數稱爲OPTARG。如果出現錯誤,它將無法通知問題。

隨着getopt-a選項,您可以使用-ab--ab格式。請記住,如果您有del定義,那麼-d選項(如果-d未指定)將擴展到--del

如果您指定帶附加選項的arg,它可以包含空格。例如。如果-l file:定義在getopt那麼它可以用作./test --file="q w"${OPTARG[file]}將是q w

OPTFILE數組包含可選參數(在--之後給出的參數)。

+0

這很好用,但如果我想運行我的腳本,可以參考--ab:。 MyScript -a -b? – user2252399

+0

@ user2252399:好的!在'case'' -a'檢查'$ 2'是否是'-b'。如果是,則執行'--ab'所需的操作(並且從命令行中刪除'-b') – TrueY

+0

@ user2252399:或者您可以在while循環之後檢查兩個' -a'和'-b'選項已設置(請參閱env.var'a'和'b')。是的,設置變量'ab'並清除'a'和'b'。 – TrueY