2013-01-21 16 views
48

próbuję zrobić skrypt powłoki, który został zaprojektowany, aby być prowadzone tak:Bash Shell Script - Sprawdź flagą i zgarnij swoją wartość

script.sh -t application 

Po pierwsze, w moim skrypcie chcę sprawdzić jeśli skrypt został uruchomiony z opcją -t. Na przykład, jeśli został uruchomiony bez flagi jak to chcę go z błędu:

script.sh 

Po drugie, zakładając, że istnieje -t flag, chcę, aby pobrać wartość i przechowywać ją w zmiennej, że mogę używać w skrypcie na przykład tak:

FLAG="application" 

dotychczas tylko postęp udało mi się zrobić na cokolwiek z tego jest to, że $ @ łapie wszystkie argumenty wiersza polecenia, ale nie wiem, jak to odnosi się do flag, lub jeśli jest to nawet możliwe.

+0

Możliwa duplikat [Jak zrobić Analizuję argumenty wiersza poleceń w bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) – Jaketr00

Odpowiedz

82

Powinieneś przeczytać ten samouczek: getopts.

Przykład z -a przełącznik, który wymaga argumentu: (! getopt = getopts)

#!/bin/bash 

while getopts ":a:" opt; do 
    case $opt in 
    a) 
     echo "-a was triggered, Parameter: $OPTARG" >&2 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

jak greybot wspomnianą:

The external command getopt(1) is never safe to use, unless you know it is GNU getopt, you call it in a GNU-specific way, and you ensure that GETOPT_COMPATIBLE is not in the environment. Use getopts (shell builtin) instead, or simply loop over the positional parameters.

+0

Czy to działa również w przypadku powłoki? – Jimmy

+1

'getopts' jest wbudowanym' bash', ale istnieje również zewnętrzny program 'getopt', który powinien działać z każdą powłoką zgodną z POSIX. – chepner

+3

Zewnętrzna komenda getopt (1) nigdy nie jest bezpieczna, chyba że * wiesz * że jest GNU getopt, nazywasz ją w sposób specyficzny dla GNU, * i * upewniasz się, że GETOPT_COMPATIBLE nie znajduje się w środowisku. Zamiast tego użyj getopts (shell builtin) lub po prostu zapętlisz parametry pozycyjne. –

22

użytkowania $# porwać liczby parametrów, o ile nie jest równa do 2 nie podano wystarczającej liczby argumentów:

if [ $# -ne 2 ]; then 
    usage; 
fi 

Następnie sprawdź czy $1 równa -t, w przeciwnym razie nie wiadomo flagi użyto:

if [ "$1" != "-t" ]; then 
    usage; 
fi 

Wreszcie przechowywać $2 w FLAG:

FLAG=$2 

Uwaga: usage() jest jakaś funkcja pokazuje składnię. Na przykład:

function usage { 
    cat << EOF 
Usage: script.sh -t <application> 

Performs some activity 
EOF 
    exit 1 
} 
0

Spróbuj shFlags - Zaawansowana biblioteka flag wiersza poleceń dla skryptów powłoki Unix.

http://code.google.com/p/shflags/

To jest bardzo dobre i bardzo elastyczny.

TYPY FLAGOWE: Jest to lista DEFINE _ *, którą można wykonać. Wszystkie flagi pobierają nazwę, wartość domyślną, tekst pomocy i opcjonalną "krótką" nazwę (jedna litera: nazwa). Niektóre flagi mają inne argumenty, które są opisane z flagą.

DEFINE_string: pobiera dowolne dane wejściowe i wprowadza je jako ciąg znaków.

DEFINE_boolean: zwykle nie przyjmuje żadnego argumentu: say --myflag, aby ustawić FLAGS_myflag na true, lub --nomyflag, aby ustawić FLAGS_myflag na false. Alternatywnie, możesz powiedzieć - mojeflag = true lub --myflag = t lub --myflag = 0 lub --myflag = false lub --myflag = f lub --myflag = 1 Przekazywanie opcji ma to samo wpływać jako przekazywanie opcji raz.

DEFINE_float: pobiera dane wejściowe i podaje je jako liczby zmiennoprzecinkowe. Ponieważ powłoka nie obsługuje funkcji pływających per se, dane wejściowe są sprawdzane tylko jako , które są poprawnymi wartościami zmiennoprzecinkowymi.

DEFINE_integer: pobiera dane wejściowe i podaje je jako liczbę całkowitą.

FLAGI SPECJALNE: Istnieje kilka flag, które mają specjalne znaczenie: help (? Lub -) drukuje listę wszystkich flag w sposób czytelny dla człowieka --flagfile = foo czytać flagi z foo. (Jeszcze nie zaimplementowane) - jak w getopt() kończy Flag przetwarzanie

Przykład użycia:

-- begin hello.sh -- 
! /bin/sh 
. ./shflags 
DEFINE_string name 'world' "somebody's name" n 
FLAGS "[email protected]" || exit $? 
eval set -- "${FLAGS_ARGV}" 
echo "Hello, ${FLAGS_name}." 
-- end hello.sh -- 

$ ./hello.sh -n Kate 
Hello, Kate. 

Uwaga: wziąłem ten tekst z dokumentacją shflags

Powiązane problemy