2015-12-23 73 views
-2

我有一個bash腳本,我需要一些參數。用法應該是之間:如何在bash中要求命令行參數?

./script.sh --scan [scan type] [keyword] 

./script.sh --help 

在例如,它應該是這樣的:

$ ./script.sh 
[Usage] 
$ ./script.sh --scan 
Specify scan type 
$ ./script.sh --help --scan 
[Usage] 
$ ./script.sh --scan short 
Specify keyword to search 
$ ./script.sh --scan short keyword 
[Starts short scanning for "keyword" - go to function where my script is, blah, blah] 
$ ./script.sh keyword --scan short 
[As above] 
$ ./script.sh keyword 
[Usage] 

我怎樣才能做到這一點?

+0

沒有什麼建的,如果這就是你在問什麼。你只需編寫代碼來做這個驗證。 –

+0

我知道,我只是要求這段代碼,因爲經過兩個小時的嘗試,我無法完成它:/ – Bielecki

+0

您將要使用['getopt'](http://manpages.ubuntu.com/手冊頁/信賴/ EN /男1/getopt.1.html)。我發現一個體面的演練[這裏](http://www.bahmanm.com/blogs/command-line-options-how-to-parse-in-bash-using-getopt)。在您的系統上搜索名爲「getopt-parse.bash」的文件作爲完整示例。 –

回答

0

我終於成功了!基本版本是:

#!/bin/bash 
function usage 
{ 
     echo "Usage: usage" 
     exit 
} 
while [ $# -gt 0 ]; do 
     case $1 in 
       -h|--help) 
         usage 
         ;; 
       -s|--scan) 
         scantype="$2" 
         shift 
         ;; 
       -*) 
         usage 
         ;; 
       *) 
         keyword="$1" 
         ;; 
     esac 
     shift 
done 
if [ -z "$scantype" ]; then 
     echo "no scantype" 
     exit 
fi 
if [[ "$scantype" != "full" && "$scantype" != "long" && "$scantype" != "extended" && "$scantype" != "short" ]]; then 
     echo "invalid scantype" 
     exit 
fi 
if [ -z "$keyword" ]; then 
     echo "nokeyword" 
     exit 
fi 
echo "scantype: $scantype" 
echo "keyword: $keyword" 

反正感謝您的幫助:)

0

這只是從我的頭頂:

if [ "$1" = "--scan" ] ; then 
    if [ "$#" -ge 2 ] ; then 
     _SCANTYPE=$2 
     if [ "$#" -ge 3 ] ; then 
      _KEYWORD=$3 
     else 
      echo -n "Specify keyword to search: " 
      read _KEYWORD 
     fi 
    else 
     echo -n "Specify scan type: " 
     read _SCANTYPE 
     echo -n "Specify keyword to search: " 
     read _KEYWORD 
    fi 
    # Actual scan code 
else 
    # Display usage info 
fi 

這是非常基本的,當然,但希望這將讓你開始。

+0

重點是不介意參數順序。 – Bielecki

+0

也許我誤解了,但你的問題開始說第一個命令行參數只應該是「 - 掃描」或「 - 幫助」。如果除「 - 掃描」之外的任何內容,則應顯示使用信息。如果它是「 - 掃描」,則應按照該順序提供掃描類型和關鍵字。那是不是你想要的? – Leslie

+0

@Bielecki:「關鍵是不介意參數順序。」該死的,在我寫下我的答案之前就錯過了。程序如何知道它是'scanType關鍵字'還是'關鍵字scanType'? .......另外,傳統的項目在'[...]'是可選的,所以它也可以是'(無)或關鍵字或掃描類型'(除了我之前列出的2)。它真的值得這麼多麻煩嗎?生命是短暫的;-) – shellter

0

幾乎任何Configure腳本從源代碼構建一個軟件將有你想要的。從Perl的:

: option parsing 
while test $# -gt 0; do 
    case "$1" in 
    -d) shift; fastread=yes;; 
    -e) shift; alldone=cont;; 
    -f) 
     shift 
     cd .. 
     if test -r "$1"; then 
      config_sh="$1" 
     else 
      echo "$me: cannot read config file $1." >&2 
      error=true 
     fi 
     cd UU 
     shift;; 
    --help|\ 
    -h) shift; error=true;; 
    -r) shift; reuseval=true;; 
    -s) shift; silent=true; realsilent=true;; 
    -E) shift; alldone=exit;; 
    -K) shift; knowitall=true;; 
    -O) shift; override=true;; 
    -S) shift; silent=true; extractsh=true;; 
    -D) 
     shift 
     case "$1" in 
     *=) 
      echo "$me: use '-U symbol=', not '-D symbol='." >&2 
      echo "$me: ignoring -D $1" >&2 
      ;; 
     *=*) echo "$1" | \ 
       sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> optdef.sh;; 
     *) echo "$1='define'" >> optdef.sh;; 
     esac 
     shift 
     ;; 
    -U) 
     shift 
     case "$1" in 
     *=) echo "$1" >> optdef.sh;; 
     *=*) 
      echo "$me: use '-D symbol=val', not '-U symbol=val'." >&2 
      echo "$me: ignoring -U $1" >&2 
      ;; 
     *) echo "$1='undef'" >> optdef.sh;; 
     esac 
     shift 
     ;; 
    -A) 
     shift 
     xxx='' 
     yyy="$1" 
     zzz='' 
     uuu=undef 
     case "$yyy" in 
      *=*) zzz=`echo "$yyy"|sed 's!=.*!!'` 
       case "$zzz" in 
       *:*) zzz='' ;; 
       *) xxx=append 
         zzz=" "`echo "$yyy"|sed 's!^[^=]*=!!'` 
         yyy=`echo "$yyy"|sed 's!=.*!!'` ;; 
       esac 
       ;; 
      esac 
      case "$xxx" in 
      '') case "$yyy" in 
       *:*) xxx=`echo "$yyy"|sed 's!:.*!!'` 
         yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` 
         zzz=`echo "$yyy"|sed 's!^[^=]*=!!'` 
         yyy=`echo "$yyy"|sed 's!=.*!!'` ;; 
       *) xxx=`echo "$yyy"|sed 's!:.*!!'` 
         yyy=`echo "$yyy"|sed 's!^[^:]*:!!'` ;; 
       esac 
       ;; 
      esac 
     case "$xxx" in 
     append) 
     echo "$yyy=\"\${$yyy}$zzz\"" >> posthint.sh ;; 
     clear) 
     echo "$yyy=''"   >> posthint.sh ;; 
     define) 
      case "$zzz" in 
     '') zzz=define ;; 
     esac 
     echo "$yyy='$zzz'"  >> posthint.sh ;; 
     eval) 
     echo "eval \"$yyy=$zzz\"" >> posthint.sh ;; 
     prepend) 
     echo "$yyy=\"$zzz\${$yyy}\"" >> posthint.sh ;; 
     undef) 
      case "$zzz" in 
     '') zzz="$uuu" ;; 
     esac 
     echo "$yyy=$zzz"  >> posthint.sh ;; 
      *) echo "$me: unknown -A command '$xxx', ignoring -A $1" >&2 ;; 
     esac 
     shift 
     ;; 
    -V) echo "$me generated by metaconfig 3.5 PL0." >&2 
     exit 0;; 
    --) break;; 
    -*) echo "$me: unknown option $1" >&2; shift; error=true;; 
    *) break;; 
    esac 
done 
0

爲了您的兩個例子

./script.sh --scan [scan type] [keyword] 

./script.sh --help 

試試這個

#!/bin/bash 
usageMsg="usage:ScriptName --scan [scan type] [keyword] OR --help" 

case $# in 
    [123]) : nothing_may_be_OK ;; 
    0) # no args, display usageMsg 
     echo "$usageMsg" >&2 ; exit 1 ;; 
esac 

case "$1" in 
    --[Hh][Ee][Ll][Pp]) echo "$usageMsg" >&2 ; exit 1 ;; 
    --[Ss][Cc][Aa][Nn]) 
     shift 
     case $# in 
     0) # using defaults 
      scanType="PrimaryScan" # change to your default scanType 
      keyword="PrimaryKeyWord" # again, change to your default value 
     ;; 
     1) 
      echo "$usageMsg" >&2 
      echo "must provide both [scan type] and [keyword] arguments. Cant continue" >&2 
      exit 1 
     ;; 
     2) 
      scanType="$1" 
      keyword="$2" 
     ;; 
     esac # case $# 
    ;; 
esac   # case $1 

#restof your code goes here 
echo "running scanner with scanType=$scanType and keyWord=$keyword" 
echo ". . . . ." 
exit 0 

我猜你的使用模式是指--scan或高級SCA N(帶細節),即--scan [scan type] [keyword]

如果你真的打算讓用戶根據需要添加[scan type] AND/OR [keyword]那麼你就需要在上面的代碼中的一些進一步使用的技術。

IHTH