Tryb nocny
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: Ubuntu
Debian
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