Sök…


Anmärkningar

  • shift flyttar positionsparametrarna till vänster så att $2 blir $1 , $3 blir $2 och så vidare.
  • "$@" är en matris med alla positionsparametrar som skickas till skriptet / funktionen.
  • "$*" är en sträng som består av alla positionsparametrar som skickas till skriptet / funktionen.

Analys av flera parametrar

Att tolka massor av parametrar är det föredragna sättet att göra detta med hjälp av en while-slinga, ett fall uttalande och skift.

shift används för att visa den första parametern i serien, vilket gör vad som brukade vara $ 2 , nu till $ 1 . Detta är användbart för att behandla argument en i taget.

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

Ingångar och utgångar

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

Åtkomst till parametrar

När du kör ett Bash-skript namnges parametrar som skickas in i skriptet i enlighet med deras position: $1 är namnet på den första parametern, $2 är namnet på den andra parametern och så vidare.

En saknad parameter utvärderar helt enkelt till en tom sträng. Kontroll av förekomsten av en parameter kan göras enligt följande:

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

Få alla parametrar

$@ och $* är sätt att interagera med alla skriptparametrar. Med hänvisning till Bash man-sidan ser vi att:

  • $* : Expanderar till positionsparametrarna, med start från en. När utvidgningen sker inom dubbla citat expanderar den till ett enda ord med värdet på varje parameter separerad med det första tecknet i IFS specialvariabel.
  • $@ : Expanderar till positionsparametrarna med början från en. När expansionen sker inom dubbla citat expanderas varje parameter till ett separat ord.

Få antal parametrar

$# får antalet parametrar som skickas till ett skript. Ett typiskt användningsfall skulle vara att kontrollera om lämpligt antal argument har skickats:

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

Exempel 1

Gå igenom alla argument och kontrollera om det är filer:

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

Exempel 2

Gå igenom alla argument och kontrollera om det är filer:

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

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

Tolkning av argument med en för-loop

Ett enkelt exempel som ger alternativen:

Välja Alt. Välja detaljer
-h --help Visa hjälp
-v --version Visa versioninformation
-dr path --doc-root path Ett alternativ som tar en sekundär parameter (en sökväg)
-i --install Ett booleskt alternativ (sant / falskt)
-* - Ogiltigt alternativ
#!/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

Inpackningsmanus

Wrapper-skript är ett skript som slår in ett annat skript eller kommando för att ge extra funktioner eller bara för att göra något mindre tråkigt.

Exempelvis egrep den faktiska egrep i nya GNU / Linux-system av ett omslagsskript som heter egrep . Så här ser det ut:

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

Så när du kör egrep i sådana system kör du faktiskt grep -E med alla argument som vidarebefordras.

I allmänhet, om du vill köra ett exempel på en skript / kommando- exmp med ett annat skript mexmp så kommer wrapper mexmp skriptet att se ut:

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

Dela strängen i en matris i Bash

Låt oss säga att vi har en strängparameter och vi vill dela den med komma

my_param="foo,bar,bash"

För att dela den här strängen med komma kan vi använda;

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

Här är IFS en speciell variabel som kallas Intern fältavskiljare som definierar tecknet eller tecknen som används för att separera ett mönster till tokens för vissa operationer.

För att komma åt ett enskilt element:

echo "${array[0]}"

För att upprepa elementen:

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

För att få både index och värde:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow