GNU/Linux >> Znalost Linux >  >> Linux

Bash Shell Script - Zkontrolujte, zda nemáte příznak a zjistěte jeho hodnotu

Vyzkoušejte shFlags -- Pokročilá knihovna příznaků příkazového řádku pro unixové shellové skripty.

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

Je velmi dobrá a velmi flexibilní.

TYPY VLAJEK:Toto je seznam DEFINE_*, které můžete udělat. Všechny příznaky berou název, výchozí hodnotu, řetězec nápovědy a volitelný 'krátký' název (jedním písmenem). Některé příznaky mají jiné argumenty, které jsou popsány příznakem.

DEFINE_string:vezme jakýkoli vstup a interpretuje jej jako řetězec.

DEFINE_boolean:obvykle nebere žádný argument:řekněte --myflag pro nastaveníFLAGS_myflag na true nebo --nomyflag pro nastavení FLAGS_myflag na false. Alternativně můžete říci --myflag=true nebo --myflag=t nebo --myflag=0 or--myflag=false nebo --myflag=f nebo --myflag=1Předání možnosti má stejný účinek jako jednorázové předání možnosti.

DEFINE_float:vezme vstup a interpretuje jej jako číslo s plovoucí desetinnou čárkou. Asshell nepodporuje floats per-se, vstup je pouze ověřen jako platná hodnota s plovoucí desetinnou čárkou.

DEFINE_integer:vezme vstup a interpretuje jej jako celé číslo.

SPECIÁLNÍ VLAJKY:Existuje několik příznaků, které mají zvláštní význam:--help (nebo -?) vytiskne seznam všech příznaků způsobem čitelným pro člověka --flagfile=foo přečtené příznaky z foo. (zatím neimplementováno) -- stejně jako v getopt(), ukončí zpracování příznaků

PŘÍKLAD POUŽITÍ:

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

Poznámka:Tento text jsem převzal z dokumentace shflags


Zde je zobecněné rozhraní s jednoduchými příkazy, které můžete vložit na začátek všech svých skriptů.

#!/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]}"

Spuštěním příkazu:

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

Výstup bude tento:

"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

Argumenty jsou v zásadě rozděleny na příznakové booleany a obecné argumenty. Tímto způsobem může uživatel umístit příznaky a booleovské argumenty kamkoli, pokud zachová obecné argumenty (pokud nějaké existují) v určeném pořadí.

Umožňujeme vám a mně, abychom se již nikdy nezabývali analýzou bash argumentů!

Aktualizovaný skript si můžete prohlédnout zde

To bylo za poslední rok nesmírně užitečné. Nyní může simulovat rozsah pomocí předpony proměnným parametrem rozsahu.

Stačí skript zavolat jako

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

Nevypadá to, že jsem implementoval rozsah argumentů, nejsem si jistý, proč jsem to asi ještě nepotřeboval.


Použijte $# pro získání počtu argumentů, pokud se nerovná 2, není poskytnut dostatek argumentů:

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

Dále zkontrolujte, zda $1 rovná se -t , jinak byl použit neznámý příznak:

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

Nakonec uložte $2 v FLAG :

FLAG=$2

Poznámka:usage() je nějaká funkce ukazující syntaxi. Například:

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

Performs some activity
EOF
   exit 1
}

Měli byste si přečíst tento tutoriál getopts.

Příklad s -a přepínač, který vyžaduje argument :

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

Použití externího příkazu getopt(1) není nikdy bezpečné, pokud víte je to GNU getopt, nazýváte jej způsobem specifickým pro GNU, a zajistíte, že GETOPT_COMPATIBLE není v prostředí. Místo toho použijte getopts (shellbuiltin) nebo jednoduše smyčkujte poziční parametry.


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Jak zkontrolovat podřetězec v Shell Script Bash?

  3. Rozdíl mezi příkazy v bash skriptu a příkazy v terminálu

  1. Formát data a času pro skript nebo proměnnou prostředí Linux

  2. konvence pojmenování pro shell skript a makefile

  3. Zkontrolujte konektivitu databáze pomocí skriptu Shell

  1. zkontrolujte, zda je argument platným datem v bash shellu

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. Jak zkontrolovat, zda soubor existuje v konkrétním adresáři ve skriptu bash?