2013-01-25 27 views
8

Nie wiem, czy to możliwe, ale chcę napisać skrypty powłoki, które działają jak zwykłe pliki wykonywalne z opcjami. W bardzo prosty przykład, rozważmy powłoki skryptu foo.sh który jest skonfigurowany do być wykonywalny:Jak pisać skrypty powłoki Uniksa z opcjami?

./foo.sh 
    ./foo.sh -o 

i kodeksem foo.sh działa jak

#!/bin/sh 
    if ## option -o is turned on 
     ## do something 
    else 
     ## do something different 
    endif 

Czy jest to możliwe i jak to zrobić? Dzięki.

Odpowiedz

9
sgeorge-mn:stack sgeorge$ cat stack.sh 
#!/bin/sh 
if [[ $1 = "-o" ]]; then 
    echo "Option -o turned on" 
else 
    echo "You did not use option -o" 
fi 

sgeorge-mn:stack sgeorge$ bash stack.sh -o 
Option -o turned on 

sgeorge-mn:stack sgeorge$ bash stack.sh 
You did not use option -o 

FYI:

$1 = First positional parameter 
$2 = Second positional parameter 
.. = .. 
$n = n th positional parameter 

Więcej zgrabnych/elastycznych opcji, przeczytaj ten drugi wątek: Using getopts in bash shell script to get long and short command line options

+0

Dzięki. Właściwie to wiem, że kłótnia, ale to zbyt leniwe ... 'getopt' wygląda fajnie. – 4ae1e1

+0

ta opcja musi być wtedy tylko pierwszym parametrem? A jeśli mam dwie opcje, jak się rozróżniasz? –

2

w ten sposób, jak to zrobić w jednym skrypcie:

#!/usr/bin/sh 
# 
# Examlple of using options in scripts 
# 

if [ $# -eq 0 ] 
then 
     echo "Missing options!" 
     echo "(run $0 -h for help)" 
     echo "" 
     exit 0 
fi 

ECHO="false" 

while getopts "he" OPTION; do 
     case $OPTION in 

       e) 
         ECHO="true" 
         ;; 

       h) 
         echo "Usage:" 
         echo "args.sh -h " 
         echo "args.sh -e " 
         echo "" 
         echo " -e  to execute echo \"hello world\"" 
         echo " -h  help (this output)" 
         exit 0 
         ;; 

     esac 
done 

if [ $ECHO = "true" ] 
then 
     echo "Hello world"; 
fi 

kliknięcie here dla źródłowego

+0

To jest prawdziwe rozwiązanie, ponieważ pozwala na dowolną opcję w dowolnej kolejności –

+0

w opcji h) Przypuszczam, że powinieneś również zastąpić 'args.sh' przez' $ 0' –

Powiązane problemy