GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Shell-Skript - Suchen Sie nach einem Flag und holen Sie sich seinen Wert

Probieren Sie shFlags aus -- Erweiterte Befehlszeilen-Flag-Bibliothek für Unix-Shell-Skripte.

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

Es ist sehr gut und sehr flexibel.

FLAG TYPES:Dies ist eine Liste der DEFINE_*'s, die Sie machen können. Alle Flags haben einen Namen, einen Standardwert, eine Hilfezeichenfolge und einen optionalen „kurzen“ Namen (Ein-Buchstaben-Name). Einige Flags haben andere Argumente, die mit dem Flag beschrieben werden.

DEFINE_string:Nimmt jede Eingabe und interpretiert sie als String.

DEFINE_boolean:verwendet normalerweise kein Argument:Sagen Sie --myflag, um FLAGS_myflag auf true zu setzen, oder --nomyflag, um FLAGS_myflag auf false zu setzen. Alternativ können Sie --myflag=true oder --myflag=t oder --myflag=0 sagen oder --myflag=false oder --myflag=f oder --myflag=1Das Übergeben einer Option hat denselben Effekt wie das einmalige Übergeben der Option.

DEFINE_float:Nimmt eine Eingabe und interpretiert sie als Fließkommazahl. Asshell unterstützt per se keine Gleitkommazahlen, die Eingabe wird lediglich als gültiger Gleitkommawert validiert.

DEFINE_integer:Nimmt eine Eingabe und interpretiert sie als Integer.

SPEZIELLE FLAGS:Es gibt ein paar Flags, die eine besondere Bedeutung haben:--help (oder -?) gibt eine Liste aller Flags in menschenlesbarer Form aus --flagfile=foo liest Flags von foo. (noch nicht implementiert)-- beendet wie in getopt() die 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 der shflags-Dokumentation entnommen


Hier ist eine verallgemeinerte einfache Schnittstelle für Befehlsargumente, die Sie oben in all Ihre Skripte 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]}"

Durch Ausführen des Befehls:

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

Die Ausgabe sieht so aus:

"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 boolesche Flags und generische Argumente unterteilt. Auf diese Weise kann ein Benutzer die Flags und booleschen Werte überall platzieren, solange er/sie die generischen Argumente (falls vorhanden) in der angegebenen Reihenfolge hält.

Erlaubt mir und jetzt Ihnen, sich nie wieder mit dem Analysieren von Bash-Argumenten auseinanderzusetzen!

Hier können Sie ein aktualisiertes Skript anzeigen

Dies war im letzten Jahr enorm nützlich. Es kann jetzt den Geltungsbereich simulieren, indem den Variablen ein Geltungsbereichsparameter vorangestellt wird.

Rufen Sie das Skript einfach auf wie

replace() (
  source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
  echo ${replaceFlags[f]}
  echo ${replaceBooleans[b]}
)

Sieht nicht so aus, als hätte ich den Argumentbereich implementiert, ich bin mir nicht sicher, warum ich ihn noch nicht benötigt habe.


Verwenden Sie $# um die Anzahl der Argumente zu erfassen, wenn sie ungleich 2 ist, werden nicht genügend Argumente bereitgestellt:

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

Überprüfen Sie als Nächstes, ob $1 entspricht -t , 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
}

Sie sollten dieses Getopts-Tutorial lesen.

Beispiel mit -a Schalter, der 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) kann niemals sicher verwendet werden, es sei denn, Sie wissen 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 (shellbuiltin) oder durchlaufen Sie einfach die Positionsparameter.


Linux
  1. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  2. Überprüfen Sie die Datenbankkonnektivität mit Shell-Skript

  3. Überprüfen Sie die IP-Gültigkeit

  4. Wie kann ich überprüfen, ob eine Datei in einem bestimmten Verzeichnis in einem Bash-Skript vorhanden ist?

  5. Überprüfen Sie, ob einer der Parameter eines Bash-Skripts mit einer Zeichenfolge übereinstimmt

Bash-Anfängerserie Nr. 1:Erstellen Sie Ihr erstes Bash-Shell-Skript und führen Sie es aus

Transliterationsskript für die Linux-Shell

So prüfen Sie, ob eine Gruppe vorhanden ist, und fügen sie hinzu, wenn dies nicht der Fall ist, in Linux Shell Script

Der MD5-Hashwert unterscheidet sich von Bash und PHP

Unterschied zwischen Befehlen im Bash-Skript und Befehlen im Terminal

Was ist der beste Weg, um zu überprüfen, ob ein Volume in einem Bash-Skript gemountet ist?