it-swarm.com.de

Bash Shell Script - Überprüfen Sie, ob eine Flagge vorhanden ist, und greifen Sie deren Wert an

Ich versuche, ein Shell-Skript zu erstellen, das so ausgeführt wird:

script.sh -t application

Zunächst möchte ich in meinem Skript prüfen, ob das Skript mit der Markierung -t ausgeführt wurde. Wenn das Flag beispielsweise wie folgt ausgeführt wurde, möchte ich einen Fehler:

script.sh

Zweitens, unter der Annahme, dass es ein -t-Flag gibt, möchte ich den Wert nehmen und in einer Variablen speichern, die ich in meinem Skript beispielsweise wie folgt verwenden kann:

FLAG="application"

Bis jetzt ist der einzige Fortschritt, den ich bei all dem machen konnte, der, dass $ @ alle Befehlszeilenargumente ergreift, aber ich weiß nicht, wie sich dies auf Flags bezieht oder ob dies überhaupt möglich ist.

57
Jimmy

Sie sollten dieses getopts Tutorial lesen.

Beispiel mit -a switch, das ein Argument erfordert:

#!/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 sagte (getopt! = getopts): 

Der externe Befehl getopt (1) ist niemals sicher zu verwenden, es sei denn, Sie sind know es ist GNU getopt, Sie nennen es GNU-spezifisch, und Sie stellen sicher. dass sich GETOPT_COMPATIBLE nicht in der Umgebung befindet. Verwenden Sie stattdessen getopts (Shell Builtin) oder ziehen Sie einfach die Positionsparameter durch.

94
Gilles Quenot

Verwenden Sie $#, um die Anzahl der Argumente zu ermitteln. Wenn diese Zahl ungleich 2 ist, stehen nicht genügend Argumente zur Verfügung:

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

Prüfen Sie als Nächstes, ob $1 gleich -t ist, ansonsten wurde ein unbekanntes Flag verwendet:

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

Speichern Sie schließlich $2 in FLAG:

FLAG=$2

Hinweis: usage() ist eine Funktion, die die Syntax zeigt. Zum Beispiel:

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

Performs some activity
EOF
   exit 1
}
24
Veger

Hier ist eine verallgemeinerte einfache Befehlsargumentschnittstelle, die Sie oben in alle Skripts einfügen können.

#!/bin/bash

declare -A flags
declare -A booleans
args=()

while [ "$1" ];
do
    arg=$1
    if [ "${1:0:1}" == "-" ]
    then
      shift
      rev=$(echo "$arg" | rev)
      if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
      then
        bool=$(echo ${arg:1} | sed s/://g)
        booleans[$bool]=true
        echo \"$bool\" is boolean
      else
        value=$1
        flags[${arg:1}]=$value
        shift
        echo \"$arg\" is flag with value \"$value\"
      fi
    else
      args+=("$arg")
      shift
      echo \"$arg\" is an arg
    fi
done


echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}

echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"

Führen Sie den Befehl aus:

bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f

Die Ausgabe wird folgende sein:

"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean


booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg

Boolean types:
    Precedes Flag(pf): true
    Final Arg(f): true
    Colon Terminated(Ct): true
    Not Mentioned(nm): 

Flag: myFlag => my flag value

Args: one => firstArg, two => secondArg, three => thirdArg

Grundsätzlich sind die Argumente in Flags Booleans und generische Argumente unterteilt .. Durch diese Vorgehensweise kann ein Benutzer die Flags und Booleans beliebig platzieren, solange er/sie die generischen Argumente (falls vorhanden) in den angegebenen Werten hält Auftrag. 

Erlaube mir und jetzt gehst du nie wieder mit bash arguemnt parsen!

4

Versuchen Sie shFlags - Erweiterte Befehlszeilenbibliothek für Unix-Shell-Skripts.

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

Es ist sehr gut und sehr flexibel. 

FLAGENTYPEN: Dies ist eine Liste der DEFINE _ * - Werte, die Sie ausführen können. Alle Flaggen nehmen einen Namen, einen Standardwert, eine Hilfefolge und einen optionalen Kurznamen (ein Buchstabe name). Einige Flags haben andere Argumente, die mit dem Flag beschrieben werden.

DEFINE_string: nimmt alle Eingaben und stellt sie als Zeichenfolge dar.

DEFINE_boolean: In der Regel ist kein Argument erforderlich: Sagen Sie --myflag, um .__ festzulegen. FLAGS_myflag auf true oder --nomyflag, um 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 hat den gleichen Effekt wie das einmalige Übergeben der Option.

DEFINE_float: Übernimmt eine Eingabe und stellt diese als Gleitkommazahl dar. Wie Shell unterstützt keine Floats an sich, die Eingabe wird lediglich als .__ validiert. ein gültiger Gleitkommawert sein.

DEFINE_integer: nimmt eine Eingabe und stellt sie als Ganzzahl dar.

SONDERFLAGGEN: Es gibt einige Flaggen, die eine besondere Bedeutung haben: --help (oder -?) druckt eine Liste aller Flaggen auf eine für Menschen lesbare Art und Weise --flagfile = foo liest Flags von foo. (noch nicht implementiert) - beendet wie in getopt () die Flag-Verarbeitung

BEISPIEL VERWENDUNG:

-- 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 der Shflags-Dokumentation übernommen

0
Anandkumar