2016-11-20 4 views
0
#function:  usage 
#description: 1. parse command line arguments 
#    2. for illegal usages, print usage message and exit 1 
#    3. otherwise, communicate to main() what flags are set 

function usage { 
while getopts ":gn:" OPT; do 
    case $OPT in 
      g) ;; 
      n) name=$OPTARG;; 
      :) echo "$USAGE" 
       exit 1 
      ;; 
      \?) echo "$USAGE" 
       exit 1 
      ;; 
      *) echo "$USAGE" 
       exit 1 
     esac 
done 


shift $(($OPTIND + 1)) 
} 

#function:  main 
#description: For Part 1: 
#    1. use usage() to parse command line arguments 
#    2. echo corresponding messages for each flag that is set 
# 
#    For Part 2: 
#    Kill processes based on the case return by `usage` 


function main { 

# TODO change the condition so that this line prints when '-g' is set 
    usage() 
if [ ! -z "g" ]; then 
    echo graceful kill is present 
fi 

# TODO change the condition so that this line prints when '-n' is set 
if [ ! -z "n" ]; then 
    echo process name is present 
fi 
main [email protected] 

Dies ist, was ich schreibe so weit, ich möchte etwas haben, wieInformationen Echo beim Parsen und nicht-Flaggen und Argument Parsen

./KillByName -g 24601
anmutigen Kill vorhanden ist

oder

./KillByName -g
Verbrauch: KillByName [-g] -n oder KillByName [-g]

oder

./KillByName -g -n bash
anmutigen Kill vorhanden
Prozessname

im Wesentlichen vorhanden ist, wenn es -g ist, dann zeigt sie es anmutig getötet wird, und mit einem Name. Wenn es -n gibt, dann heißt es, der Name wird beendet und mit einem Namen versehen. Ich fand mein Skript kann die Nachricht drucken, ob anmutig töten Gegenwart oder Name vorhanden ist, aber nicht den Fehler $ USAGE drucken kann.

BTW: dies nur zur Information der Nutzung ist, nicht wirklich Programm, das Programm

Antwort

1

Zunächst einmal töten,

usage() 

nicht der richtige Weg ist, dass Sie eine Funktion aufrufen, sollte es waren

usage 

Aber es gibt ein Problem mit, dass Sie vorbei keine Argumente an die Funktion usage von main, so sollte es Biene haben n

usage "[email protected]" # Double quotes to prevent word splitting 

Obwohl der Begriff "anmutige Tötung" ist ein Paradox in sich selbst, Sie so etwas wie

while getopts ":gn:" OPT; do 
gracekill=0; //s 
case $OPT in 
     g) gracekill=1;; 
     n) name=$OPTARG;; 
     :) echo "$USAGE" 
      exit 1 
     ;; 
     \?) echo "$USAGE" 
      exit 1 
     ;; 
     *) echo "$USAGE" 
      exit 1 
    esac 
    done 
    echo "$gracekill $name" # Mind double quotes 

Dann tun dies tun könnte:

result=$(usage "[email protected]") 
if [ ${result:0:1} -eq '1' ] 
then 
#gracefully kill the application 
kill -9 $(pgrep "${result:1}") 
else 
#ruthlessly terminate it 
kill -15 $(pgrep "${result:1}") 
fi 

Für mehr auf ${var:offset:length} Form, siehe [ param expansion ]

Notizen: Ich nehme an, dass Sie die Prozessnamen an die Funktion übergeben, wenn Sie die Prozessnummer übergeben, dann brauchen Sie nicht pgpep dh kill -15 $(pgrep "${result:1}") wird kill -15 "${result:1}" und so werden. Goodluck!

+0

Und wie man -g ein optionales Flag macht. Das heißt, eine PID wird immer noch benötigt, aber mit -g wird der Prozess elegant beendet. Aber wenn -g exit aber pid nicht existiert, wird es falsche Informationen geben? – faker

+0

Ich würde empfehlen, die 'usage'-Funktion in einer Subshell auszuführen (was' result = $ (usage "$ @") 'tut) - es fügt die Kompliziertheit des Parsens seiner Ausgabe hinzu (abhängig davon, welche Form die Argumente annehmen), das könnte schwierig sein, richtig zu machen), und auch die 'exit 1's * beenden das Hauptskript nicht, sondern nur die Untershell. IMO, es ist viel sauberer, nur die Option Parsing-Code inline in den Hauptteil des Skripts zu setzen, und all diese Komplexität zu vermeiden. –