2013-07-08 50 views
0

我正在嘗試弄清楚如何使用bash getopts來處理命令行。我有以下代碼:獲得bash getopts做些什麼

while getopts "e:n:t:s:h" opt 
     do 

      echo $opt 
     done 

我有這樣的bash命令行調用它:

。 ./testopts.sh -e MyE -s聖地

沒有打印。

請幫

+2

怎麼樣谷歌? http://wiki.bash-hackers.org/howto/getopts_tutorial –

回答

2

$opt將只打印開關es你,但打印傳入的參數,你需要呼應$OPTARG爲好。

喜歡這個劇本:

while getopts "e:n:t:s:h" opt 
do 
    echo $opt $OPTARG 
done 
-1
OPTIND=1 
while getopts "e:n:t:s:h" opt 
do 
    case $opt in 
     e) echo "e OPTARG=${OPTARG} ";; 
     n) echo "n OPTARG=${OPTARG} ";; 
     t) echo "t OPTARG=${OPTARG} ";; 
     s) echo "s OPTARG=${OPTARG} ";; 
     h) echo "h OPTARG=${OPTARG} ";; 
    esac 
done 
+0

我其實不是在尋找反例的例子。我想了解爲什麼我的示例不起作用。在我的例子中,我希望至少可以打印參數,我明白爲什麼值沒有被打印。 – user331905

+0

你的意思是爲什麼-e和-s未被打印?當我在頂部使用代碼示例時,它們會打印出來。 –

1

這裏是我使用什麼參數處理的模板。

這是遠遠沒有達到最佳(例如佔用過多的sed,而不是內建的bash正則表達式等),但你可以使用它的開頭:

#!/bin/bash 

#define your options here 
OPT_STR=":hi:o:c" 

#common functions 
err() { 1>&2 echo "$0: Error: [email protected]"; return 1; } 
required_arg() { err "Option -$1 need argument"; } 
checkarg() { [[ "$1" =~ ${optre:--} ]] && { required_arg "$2"; return 1; } || { echo "$1" ; return 0; } } 
phelp() { err "Usage: $0" "$(sed 's/^://;s/\([a-zA-Z0-9]\)/ -&/g;s/:/ [arg] /g;s/ */ /g' <<< "$OPT_STR")"; return 1; } 

do_work() { 
    echo "Here should go your script for processing $1" 
} 

## MAIN 
declare -A OPTION 
optre=$(sed 's/://g;s/.*/-[&]/' <<<"$OPT_STR") 
while getopts "$OPT_STR" opt; 
do 
    #change here i,o,c to your options 
    case $opt in 
    i) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;; 
    o) OPTION[$opt]=$(checkarg "$OPTARG" $opt) || exit 1;; 
    c) OPTION[$opt]=1;; 
    h) phelp || exit 1;; 
    :) required_arg "$OPTARG" || exit 1 ;; 
    \?) err "Invalid option: -$OPTARG" || exit 1;; 
    esac 
done 

shift $((OPTIND-1)) 
#change here your options... 
echo "iarg: ${OPTION[i]:-undefined}" 
echo "oarg: ${OPTION[o]:-undefined}" 
echo "carg: ${OPTION[c]:-0}" 
echo "remainder args: [email protected]=" 

for arg in "[email protected]" 
do 
    do_work "$arg" 
done