2015-12-23 2 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/ страницы руководство/испытанные/о/man1/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

Возможно, я неправильно понял, но в начале вашего вопроса говорилось, что первым параметром командной строки должно быть только «--scan» или «--help». Если это ничего, кроме «--scan», должно отображаться сообщение об использовании. Если это «--scan», тогда должен быть указан тип сканирования и ключевое слово в этом порядке. Разве это не то, что вы намеревались? – Leslie

+0

@Bielecki: «Дело в том, чтобы не учитывать порядок параметров». Дарн, пропустил это, прежде чем я написал свой ответ. Как программа может знать, является ли это «ключевое слово scanType» или «keyword scanType»? ....... ТАКЖЕ, традиционно пункты в списке вызовов, окруженные в '[...] 'являются необязательными, поэтому также может быть' (ничего) ИЛИ ключевым словом ИЛИ scanType' (кроме 2, перечисленных ранее). Неужели это стоит того? Life is short ;-) – shellter

0

Практически любой скрипт для создания части программного обеспечения из источника будет иметь то, что вы хотите. От языка 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 

Try это

#!/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 п (с подробностями), т.е. --scan [scan type] [keyword]

Если вы действительно намерены для пользователя необязательно добавлять [scan type] И/ИЛИ [keyword] тогда вам понадобится дальнейшее использование методов в приведенном выше коде.

IHTH

Смежные вопросы