2010-12-29 2 views
2

Ich habe nicht viel praktische Programmiererfahrung. Ich schrieb eine Funktion in Shell-Skript, um Parameter basierend auf deren Werte ein externes Programm mit anderen Parametern aufgerufen wird. (Der Programmname wird als Parameter an die Funktion übergeben, in diesem Fall $ 1).Wie kann ich in der Shell effizient Argumente verarbeiten, die an eine Funktion übergeben werden, um andere Programme aufzurufen, ohne zu viele bedingte Anweisungen zu verwenden?

Irgendwie finde ich diesen Code beschissen und möchte die Linien reduzieren und effizienter machen. Ich habe das Gefühl, dass es hier zu viele Bedingungen gibt und es könnte einen einfacheren Weg geben, dies zu tun. Irgendwelche Ideen? Es muss einen besseren Weg geben, dies zu tun. Vielen Dank.

Code is here

+0

was hast du an den Händen? – ajreal

Antwort

3

Sie können die Argumentliste als Array mit separaten conditionals für jede Variable ein Teil der Liste erstellen (und nicht verschachtelten Bedingungen wie Sie haben). Dies ist sehr ähnlich zu Roland Illigs Antwort, nur dass die Verwendung eines Arrays anstelle einer Textvariablen mögliche Probleme mit lustigen Zeichen (wie Leerzeichen) in Argumenten vermeidet (siehe BashFAQ #050) - es wird hier wahrscheinlich nicht benötigt, aber ich bevorzuge es sicherer Weg, um Überraschungen später zu vermeiden. Beachten Sie auch, dass ich angenommen habe, dass die Argumente in einer bestimmten Reihenfolge sein müssen - wenn -disp vor `refresh gehen kann, dann können die "alle Versionen" Teile alle zusammen am Anfang zusammengestellt werden.

# Build the argument list, depending on a variety of conditions 
arg_list=("-res" "$2" "$3") # all versions start this way 

if [ "$7" = "allresolutions" ]; then 
    # allresolutions include the refresh rate parameter to be passed 
    arg_list+=("-refresh" "$4") 
fi 

arg_list+=("-disp" "$5") # all versions need the disp value 

if [ "$6" = "nooptions" ]; then 
    : # nothing to add 
elif [ "$6" = "vcaa" ]; then 
    arg_list+=("-vcaa" "5") 
elif [ "$6" = "fsaa" ]; then 
    arg_list+=("-fsaa" "4") 
elif [ "$6" = "vcfsaa" ]; then 
    arg_list+=("-vcaa" "5" "-fsaa" "4") 
fi 

if [ "$1" != "gears" ]; then 
    # ctree has time-to-run passed as parameter to account for suitable time for 
    # logging fps score. If bubble fps capture strategy is different from ctree, 
    # then this if statement has to be modified accordingly 
    arg_list+=("-sec" "$8") 
fi 

# Now actually run it 
./"$1" "${arg_list[@]}" &>> ~/fps.log 
+0

Ehrfürchtig. Das ist, was ich gesucht habe. – fzkl

0

Sie könnten getopts (siehe example) verwenden, wenn Sie die große Anzahl von Argumenten verarbeiten.

1

Anstelle des wiederholten inneren "if ... elif ... fi" können Sie diesen Teil der Argumentverarbeitung einmal machen und in einer Variablen speichern (hier: Optionen).

case $6 in 
nooptions) options="";; 
vcaa) options="-vcaa 5";; 
fsaa) options="-fsaa 4";; 
vcfsaa) options="-vcaa 5 -fsaa 4";; 
esac 

... 

./$1 -res $2 $3 -refresh $4 -disp $5 $options -sec $8 
+0

und extrapolieren Sie diesen Ratschlag für den Umgang mit '$ 1' und' $ 7' –