Skip to content
Na tej stronie

Rozszerzona składnia – Tworzenie skryptów Bash, krok po kroku.

W tym artykule przejrzymy dodatkową składnię, którą wprowadza język powłoki Bash.

Ta część strony została oznaczona, jakoby była w trakcie konstrukcji. To oznacza, że treść w miejscu tego komunikatu zostanie uzupełniona w najbliższym czasie.

Tablice

Tablice są specjalnym typem zmiennej, która przechowuje wiele wartości.

Definiujemy taką zmienną poprzez użycie nawiasów okrągłych, a kolejne wartości oddzielamy spacją.

bash
dystrybucje=('Ubuntu' 'Debian' 'Fedora' 'Arch Linux')
dystrybucje=('Ubuntu' 'Debian' 'Fedora' 'Arch Linux')

Z tak utworzonej tablicy można pobierać wartości według numeru indeksu.

bash
echo Pierwszy element: "${dystrybucje[0]}" # Ubuntu
echo Drugi element: "${dystrybucje[1]}" # Debian
echo Trzeci element: "${dystrybucje[2]}" # Fedora
echo Pierwszy element: "${dystrybucje[0]}" # Ubuntu
echo Drugi element: "${dystrybucje[1]}" # Debian
echo Trzeci element: "${dystrybucje[2]}" # Fedora

Wyróżniamy też poniższą składnię.

bash
echo Liczba elementów: "${#dystrybucje[@]}" # 4
echo Liczba elementów: "${#dystrybucje[@]}" # 4

Poniżej iterujemy po każdej wartości tablicy dystrybucje.

bash
for element in "${dystrybucje[@]}"; do
  echo "$element"
done
for element in "${dystrybucje[@]}"; do
  echo "$element"
done
Ubuntu
Debian
Fedora
Arch Linux
Ubuntu
Debian
Fedora
Arch Linux

${dystrybucje[@]} zwraca wszystkie elementy tablicy, w tym przypadku: UbuntuDebian Fedora Arch Linux.

Możemy również iterować po indeksach tablicy. Jest to szczególnie przydatne, kiedy jest potrzeba wykonania operacji według konkretnych pozycji elementów tablicy.

bash
for i in "${!dystrybucje[@]}"; do
  echo "$((i+1))". "${dystrybucje[$i]}"
done
for i in "${!dystrybucje[@]}"; do
  echo "$((i+1))". "${dystrybucje[$i]}"
done
1. Ubuntu
2. Debian
3. Fedora
4. Arch Linux
1. Ubuntu
2. Debian
3. Fedora
4. Arch Linux

Wyrażenie ${!dystrybucje[@]} zwraca wszystkie indeksy elementów tablicy, w tym przypadku: 0 1 2 3.

Wyświetlamy poleceniem echo indeks o jeden większy, ponieważ naturalnie liczymy elementy od jedynki.

Lista argumentów jako tablica

bash
#!/usr/bin/env bash
argumenty=("$@")
for i in "${!argumenty[@]}"; do
  echo "Argument numer" "$((i+1))": "${dystrybucje[$i]}"
done
#!/usr/bin/env bash
argumenty=("$@")
for i in "${!argumenty[@]}"; do
  echo "Argument numer" "$((i+1))": "${dystrybucje[$i]}"
done

Przypominamy, że "$@" nie zwraca argumentu zerowego, to jest nazwy albo ścieżki skryptu, w zależności od tego jak został on uruchomiony.

Lista argumentów jako tablica w funkcji

W poniższym przykładzie przekazujemy argumenty do funkcji wyswietlArgumenty, która wczytuje je do wewnętrznej tablicy argumenty.

bash
#!/usr/bin/env bash

wyswietlArgumenty() {
  local argumenty=("$@")
  for i in "${!argumenty[@]}"; do
    echo "Argument numer" "$((i+1))": "${argumenty[$i]}"
  done
}

wyswietlArgumenty Argument1 Argument2 "Inny argument"
#!/usr/bin/env bash

wyswietlArgumenty() {
  local argumenty=("$@")
  for i in "${!argumenty[@]}"; do
    echo "Argument numer" "$((i+1))": "${argumenty[$i]}"
  done
}

wyswietlArgumenty Argument1 Argument2 "Inny argument"

Wewnątrz funkcji tworzymy zmienną argumenty jako lokalną, aby nie zmieniała ona stanu poza funkcją i nie powodowała niepożądanego działania.

Wczytanie słów z wejścia jako listę argumentów

bash
read -a slowa

for i in "${!argumenty[@]}"; do
  echo "Argument numer" "$((i+1))": "${dystrybucje[$i]}"
done
read -a slowa

for i in "${!argumenty[@]}"; do
  echo "Argument numer" "$((i+1))": "${dystrybucje[$i]}"
done
Ta część strony została oznaczona, jakoby była w trakcie konstrukcji. To oznacza, że treść w miejscu tego komunikatu zostanie uzupełniona w najbliższym czasie.

Rozszerzona składnia pętli

Ta część strony została oznaczona, jakoby była w trakcie konstrukcji. To oznacza, że treść w miejscu tego komunikatu zostanie uzupełniona w najbliższym czasie.
bash
for ((i=0; i<10; i++)); do
  echo Liczba "$i"
done
for ((i=0; i<10; i++)); do
  echo Liczba "$i"
done

Wskazówka 😃

Powyższą pętlę można również zapisać w poniższy sposób, używając standardowej składni i narzędzia seq.

bash
for i in $(seq 10); do
  echo Liczba "$i"
done
for i in $(seq 10); do
  echo Liczba "$i"
done

Niestandardowa składnia komendy sprawdzającej

Bash posiada komendę [[, która wspiera dodatkową składnię i zawiera więcej operacji sprawdzających.

Sprawdzanie, czy tekst spełnia wyrażenie regularne

Poniższy przykład sprawdza, czy zmienna $wejscie jest cyfrą od 0, do 9.

bash
wejscie=6
if ! [[ "$wejscie" =~ ^[0-9]$ ]]; then
  echo "Wejście $wejscie nie jest cyfrą 0-9"
fi
wejscie=6
if ! [[ "$wejscie" =~ ^[0-9]$ ]]; then
  echo "Wejście $wejscie nie jest cyfrą 0-9"
fi

Wskazówka 😃

Standardowym sposobem na sprawdzenie zmiennej lub innego wejście według wyrażenia regularnego jest komenda grep.

bash
wejscie=6
if ! echo "$wejscie" | grep -q -E '^[0-9]$'; then
  echo "Wejście $wejscie nie jest cyfrą 0-9"
fi
wejscie=6
if ! echo "$wejscie" | grep -q -E '^[0-9]$'; then
  echo "Wejście $wejscie nie jest cyfrą 0-9"
fi

W pewnych przypadkach można użyć instrukcji case.

bash
wejscie=4
case "$wejscie" in
1|2|3|4|5|6|7|8|9)
  ;;
*)
  echo "Wejście $wejscie nie jest cyfrą 0-9"
  ;;
esac
wejscie=4
case "$wejscie" in
1|2|3|4|5|6|7|8|9)
  ;;
*)
  echo "Wejście $wejscie nie jest cyfrą 0-9"
  ;;
esac