2013-01-21 7 views
48

Ich versuche, ein Shell-Skript zu machen, die wie folgt ausgeführt werden ausgelegt:Bash-Shell-Skript - Überprüfen Sie, ob eine Flagge und greifen ihren Wert

script.sh -t application 

Zum einen in meinem Skript möchte ich überprüfen, um zu sehen, wenn das Skript mit dem Flag -t ausgeführt wurde. Zum Beispiel, wenn es ohne die Flagge wie diese ausgeführt wurde ich es auf Fehler wollen:

script.sh 

Zweitens vorausgesetzt, es gibt ein Flag -t ist, möchte ich den Wert packen und speichern sie in einer Variablen, die ich kann, verwenden in meinem Skript zum Beispiel wie folgt aus:

FLAG="application" 

Bisher der einzige Fortschritt, den ich habe in der Lage gewesen, auf irgendetwas davon zu machen, ist, dass $ @ all die Befehlszeilenargumente greift aber ich weiß nicht, wie diese bezieht sich auf Fahnen, oder wenn das überhaupt möglich ist.

+0

Mögliches Duplikat von [Wie Ich parse Befehlszeilenargumente in bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) – Jaketr00

Antwort

82

Sie sollten dieses getopts Tutorial lesen.

Beispiel mit -a Schalter, der ein Argument erfordert: (! 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 

Wie greybot gesagt:

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

Funktioniert das auch für Shell? – Jimmy

+1

'getopts' ist ein' bash', aber es gibt auch ein externes 'getopt' Programm, das mit jeder POSIX-kompatiblen Shell funktionieren sollte. – chepner

+3

Der externe Befehl getopt (1) ist niemals sicher zu benutzen, außer Sie * wissen * es ist GNU getopt, Sie nennen es GNU-spezifisch, * und * Sie stellen sicher, dass GETOPT_COMPATIBLE nicht in der Umgebung ist. Verwenden Sie stattdessen getopts (Shell-Built-in) oder einfach die Positionsparameter. –

22

Verwenden $# die Anzahl der Argumente zu greifen, wenn es ungleich zu 2 gibt es nicht genug Argumente zur Verfügung gestellt:

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

Als nächstes prüfen, ob $1-t gleich, sonst ein unbekannter Flagge verwendet:

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

Schließlich speichern $2 in FLAG:

FLAG=$2 

Hinweis: usage() einige Funktion ist die Syntax zeigt. Beispiel:

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

Performs some activity 
EOF 
    exit 1 
} 
0

Testen Sie shFlags - Erweiterte Befehlszeilen-Flag-Bibliothek für Unix-Shell-Skripts.

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

Es ist sehr gut und sehr flexibel.

FLAG TYPEN: Dies ist eine Liste der DEFINE_ * 's, die Sie tun können. Alle Flags nehmen einen Namen, einen Standardwert, eine Hilfsstring und einen optionalen 'kurzen' Namen (ein Buchstabe Name). Einige Flags haben andere Argumente, die mit dem Flag beschrieben werden.

DEFINE_string: nimmt jede Eingabe und stellt sie als Zeichenfolge dar.

DEFINE_boolean: nimmt normalerweise kein Argument an: Sagen Sie --myflag, um FLAGS_myflag auf true oder --nomyflag auf FLAGS_myflag auf false zu setzen. Alternativ können Sie sagen: --myflag = true oder --myflag = t oder --myflag = 0 oder --myflag = false oder --myflag = f oder --myflag = 1 Das Übergeben einer Option ist gleich beeinflussen als einmal die Option übergeben.

DEFINE_float: nimmt eine Eingabe und stellt sie als Fließkommazahl dar. Da Shell Floats per se nicht unterstützt, wird die Eingabe lediglich als validiert, was ein gültiger Gleitkommawert ist.

DEFINE_integer: nimmt eine Eingabe und stellt sie als ganze Zahl dar.

SPECIAL FLAGS: Es gibt ein paar Fahnen, die eine besondere Bedeutung haben: --help (? Oder -) druckt eine Liste aller Flaggen in einer lesbarer Form ausgeben --flagfile = foo Flaggen von foo lesen. (Noch nicht implementiert) - wie in getopt(), beendet Flag-Verarbeitung

Verwendungsbeispiel:

-- 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. 

Hinweis: Ich habe diesen Text aus shflags Dokumentation

Verwandte Themen