Szukaj…


Uwagi

  • shift przesuwa parametry pozycji w lewo, tak że $2 $1 staje się $1 $3 $2 staje się $2 i tak dalej.
  • "$@" to tablica wszystkich parametrów pozycyjnych przekazanych do skryptu / funkcji.
  • "$*" jest łańcuchem złożonym ze wszystkich parametrów pozycyjnych przekazanych do skryptu / funkcji.

Analiza wielu parametrów

Do analizowania wielu parametrów, preferowanym sposobem osiągnięcia tego celu jest za pomocą pętli while, oświadczenie sprawy oraz zmianę.

shift służy do wyskakiwania pierwszego parametru w szeregu, co dawniej wynosiło 2 USD , a teraz 1 USD . Jest to przydatne do przetwarzania argumentów pojedynczo.

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

Wejścia i wyjścia

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

Dostęp do parametrów

Podczas wykonywania skryptu Bash parametry przekazywane do skryptu są nazywane zgodnie z ich pozycją: $1 to nazwa pierwszego parametru, $2 to nazwa drugiego parametru i tak dalej.

Brakujący parametr po prostu przekształca się w pusty ciąg. Sprawdzanie istnienia parametru można wykonać w następujący sposób:

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

Uzyskiwanie wszystkich parametrów

$@ i $* to sposoby interakcji ze wszystkimi parametrami skryptu. Odwołując się do strony podręcznika użytkownika Bash , widzimy, że:

  • $* : Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Kiedy rozwinięcie występuje w obrębie podwójnych cudzysłowów, rozwija się do pojedynczego słowa z wartością każdego parametru oddzieloną pierwszym znakiem zmiennej specjalnej IFS.
  • $@ : Rozwija się do parametrów pozycyjnych, zaczynając od jednego. Kiedy rozwinięcie występuje w podwójnych cudzysłowach, każdy parametr rozwija się do osobnego słowa.

Uzyskiwanie liczby parametrów

$# pobiera liczbę parametrów przekazanych do skryptu. Typowym przypadkiem użycia byłoby sprawdzenie, czy przekazano odpowiednią liczbę argumentów:

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

Przykład 1

Zapętlaj wszystkie argumenty i sprawdź, czy są to pliki:

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

Przykład 2

Zapętlaj wszystkie argumenty i sprawdź, czy są to pliki:

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

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

Analiza argumentów za pomocą pętli for

Prosty przykład, który zawiera opcje:

Optować Alt. Optować Detale
-h --help Pokaż pomoc
-v --version Pokaż informacje o wersji
-dr path --doc-root path Opcja, która pobiera dodatkowy parametr (ścieżkę)
-i --install Opcja boolowska (prawda / fałsz)
-* - Niepoprawna opcja
#!/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

Skrypt opakowania

Wrapper script to skrypt, który otacza inny skrypt lub polecenie, aby zapewnić dodatkowe funkcje lub po prostu uczynić coś mniej uciążliwym.

Na przykład rzeczywiste egrep w nowym systemie GNU / Linux jest zastępowane przez skrypt otoki o nazwie egrep . Tak to wygląda:

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

Tak więc, kiedy uruchamiasz egrep w takich systemach, faktycznie uruchamiasz grep -E z przekazanymi wszystkimi argumentami.

W ogólnym przypadku, jeśli chcesz uruchomić przykładowy skrypt / polecenie exmp z innym skryptem mexmp skrypt otoki mexmp będzie wyglądał następująco:

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

Podziel ciąg na tablicę w Bash

Powiedzmy, że mamy parametr String i chcemy go podzielić przecinkiem

my_param="foo,bar,bash"

Aby podzielić ten ciąg przecinkami, możemy użyć;

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

W tym przypadku IFS jest specjalną zmienną o nazwie Wewnętrzny separator pól, który definiuje znak lub znaki używane do rozdzielania wzorca na tokeny dla niektórych operacji.

Aby uzyskać dostęp do pojedynczego elementu:

echo "${array[0]}"

Aby iterować po elementach:

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

Aby uzyskać zarówno indeks, jak i wartość:

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow