Zoeken…


Opmerkingen

  • shift verschuift de positionele parameters naar links zodat $2 $1 , $3 wordt $2 enzovoort.
  • "$@" is een array van alle positionele parameters die aan het script / de functie zijn doorgegeven.
  • "$*" is een string die bestaat uit alle positionele parameters die aan het script / de functie zijn doorgegeven.

Meerdere parameters parseren

Om veel parameters te ontleden, is de voorkeursmethode om dit te doen een while- lus, een case- statement en een shift .

shift wordt gebruikt om de eerste parameter in de reeks te laten verschijnen, wat vroeger $ 2 was , nu $ 1 . Dit is handig voor het één voor één verwerken van argumenten.

#!/bin/bash

# Load the user defined parameters
while [[ $# > 0 ]]
do
        case "$1" in

                -a|--valueA)
                        valA="$2"
                        shift
                        ;;

                -b|--valueB)
                        valB="$2"
                        shift
                        ;;

                --help|*)
                        echo "Usage:"
                        echo "    --valueA \"value\""
                        echo "    --valueB \"value\""
                        echo "    --help"
                        exit 1
                        ;;
        esac
        shift
done

echo "A: $valA"
echo "B: $valB"

Ingangen en uitgangen

$ ./multipleParams.sh --help
Usage:
    --valueA "value"
    --valueB "value"
    --help

$ ./multipleParams.sh
A: 
B:

$ ./multipleParams.sh --valueB 2
A: 
B: 2

$ ./multipleParams.sh --valueB 2 --valueA "hello world"
A: hello world
B: 2

Toegang tot parameters

Bij het uitvoeren van een Bash-script krijgen parameters die in het script worden doorgegeven een naam in overeenstemming met hun positie: $1 is de naam van de eerste parameter, $2 is de naam van de tweede parameter, enzovoort.

Een ontbrekende parameter resulteert eenvoudig in een lege string. Het controleren van het bestaan van een parameter kan als volgt worden gedaan:

if [ -z "$1" ]; then
    echo "No argument supplied"
fi

Alle parameters ophalen

$@ en $* zijn manieren om te communiceren met alle scriptparameters. Verwijzend naar de Bash man-pagina zien we dat:

  • $* : Breidt uit naar de positionele parameters, beginnend bij één. Wanneer de uitbreiding binnen dubbele aanhalingstekens plaatsvindt, wordt deze uitgebreid tot een enkel woord met de waarde van elke parameter gescheiden door het eerste teken van de speciale variabele IFS.
  • $@ : Breidt uit naar de positionele parameters, beginnend bij één. Wanneer de uitbreiding binnen dubbele aanhalingstekens plaatsvindt, wordt elke parameter uitgebreid naar een afzonderlijk woord.

Het aantal parameters verkrijgen

$# haalt het aantal parameters op dat in een script wordt doorgegeven. Een typisch geval is om te controleren of het juiste aantal argumenten is doorgegeven:

if [ $# -eq 0 ]; then
    echo "No arguments supplied"
fi

voorbeeld 1

Doorloop alle argumenten en controleer of dit bestanden zijn:

for item in "$@"
do  
    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Voorbeeld 2

Doorloop alle argumenten en controleer of dit bestanden zijn:

for (( i = 1; i <= $#; ++ i ))
do
    item=${@:$i:1}

    if [[ -f $item ]]; then
        echo "$item is a file"
    fi  
done

Argument parsing met behulp van een for-lus

Een eenvoudig voorbeeld dat de opties biedt:

opteren Alt. opteren Details
-h --help Hulp laten zien
-v --version Toon versie-informatie
-dr path --doc-root path Een optie waarbij een secundaire parameter (een pad) wordt gebruikt
-i --install Een booleaanse optie (waar / onwaar)
-* - Ongeldige optie
#!/bin/bash
dr=''
install=false

skip=false
for op in "$@";do
    if $skip;then skip=false;continue;fi
    case "$op" in
        -v|--version)
            echo "$ver_info"
            shift
            exit 0
            ;;
        -h|--help)
            echo "$help"
            shift
            exit 0
            ;;
        -dr|--doc-root)
            shift
            if [[ "$1" != "" ]]; then
                dr="${1/%\//}"
                shift
                skip=true
            else
                echo "E: Arg missing for -dr option"
                exit 1
            fi
            ;;
        -i|--install)
            install=true
            shift
            ;;
        -*)
            echo "E: Invalid option: $1"
            shift
            exit 1
            ;;
    esac
done

Wrapper-script

Wrapper-script is een script dat een ander script of commando omhult om extra functionaliteiten te bieden of gewoon om iets minder saai te maken.

De werkelijke egrep in het nieuwe GNU / Linux-systeem wordt bijvoorbeeld vervangen door een wrapper-script met de naam egrep . Zo ziet het eruit:

#!/bin/sh
exec grep -E "$@"

Dus als je egrep in dergelijke systemen uitvoert, egrep je eigenlijk grep -E met alle doorgegeven argumenten.

Als u in het algemeen een voorbeeldscript / exmp wilt uitvoeren met een ander script mexmp , ziet het wrapper mexmp script er als volgt uit:

#!/bin/sh
exmp "$@" # Add other options before "$@"
# or 
#full/path/to/exmp "$@"

Splitstring in een array in Bash

Laten we zeggen dat we een String-parameter hebben en deze willen splitsen op komma

my_param="foo,bar,bash"

Om deze string door komma's te splitsen kunnen we gebruiken;

IFS=',' read -r -a array <<< "$my_param"

Hier is IFS een speciale variabele met de naam Intern veldscheidingsteken die het teken of de tekens definieert die worden gebruikt om een patroon in tokens te scheiden voor sommige bewerkingen.

Om toegang te krijgen tot een individueel element:

echo "${array[0]}"

Om de elementen te herhalen:

for element in "${array[@]}"
do
    echo "$element"
done

Om zowel de index als de waarde te krijgen:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow