Jak używać instrukcji Bash If (z 4 przykładami)
Opublikowany: 2023-05-08if
then
fi
. Dodaj słowa kluczowe elif
dla dodatkowych wyrażeń warunkowych lub słowo kluczowe else
, aby zdefiniować sekcję typu catch-all kodu, która jest wykonywana, jeśli nie została wykonana żadna poprzednia klauzula warunkowa.Wszystkie nietrywialne skrypty Bash muszą podejmować decyzje. Instrukcja Bash if pozwala twojemu skryptowi linuksowemu zadawać pytania i, w zależności od odpowiedzi, uruchamiać różne sekcje kodu. Oto jak działają.
Co to jest wykonanie warunkowe?
We wszystkich skryptach Bash, z wyjątkiem tych najbardziej trywialnych, zwykle istnieje potrzeba, aby przepływ wykonania przebiegał inną ścieżką w skrypcie, w zależności od wyniku decyzji. Nazywa się to wykonywaniem warunkowym.
Jednym ze sposobów decydowania, którą gałąź wykonania wybrać, jest użycie instrukcji if
. Możesz usłyszeć instrukcje if
wywołane instrukcjami if then
lub instrukcjami if then else
. To różne nazwy tej samej rzeczy.
Instrukcja if
mówi, że jeśli coś jest prawdziwe, zrób to . Ale jeśli coś jest fałszywe, zrób to zamiast tego. Tym „czymś” może być wiele rzeczy, na przykład wartość zmiennej, obecność pliku lub dopasowanie dwóch łańcuchów.
Wykonywanie warunkowe jest niezbędne dla każdego sensownego skryptu. Bez tego jesteś bardzo ograniczony w tym, co możesz zrobić ze swoim skryptem. Dopóki nie będzie w stanie podejmować sensownych decyzji, nie będziesz w stanie podejmować rzeczywistych problemów i tworzyć praktycznych rozwiązań.
Instrukcja if
jest prawdopodobnie najczęściej używanym sposobem uzyskania wykonania warunkowego. Oto jak używać go w skryptach Bash.
POWIĄZANE: Jak sprawdzić, czy plik istnieje w skryptach Linux Bash
Prosty przykład instrukcji if
To jest kanoniczna postać najprostszej instrukcji if
:
jeśli [ten-warunek-jest-prawdziwy] Następnie wykonaj-te-instrukcje fi
Jeśli warunek w tekście ma wartość true, wykonywane są wiersze skryptu w klauzuli then
. Jeśli przeglądasz skrypty napisane przez innych, możesz zobaczyć instrukcję if
zapisaną w następujący sposób:
if [ten-warunek-jest-prawdziwy]; Następnie wykonaj-te-instrukcje fi
Niektóre punkty do zapamiętania:
- Instrukcja
if
jest zakończona zapisemfi
. - Po pierwszym nawiasie ”
[
” i przed drugim nawiasem ”]
” testu warunkowego musi być spacja. - Jeśli zamierzasz umieścić słowo kluczowe
then
w tym samym wierszu co test warunkowy, upewnij się, że użyłeś średnika ”;
” po teście.
Możemy dodać opcjonalną klauzulę else
, aby wykonać jakiś kod, jeśli test warunku okaże się fałszywy. Klauzula else
nie wymaga słowa kluczowego then
.
jeśli [ten-warunek-jest-prawdziwy] Następnie wykonaj-te-instrukcje w przeciwnym razie wykonaj-te-instrukcje-zamiast fi
Ten skrypt pokazuje prosty przykład instrukcji if
używającej klauzuli else
. Test warunkowy sprawdza, czy wiek klienta jest większy lub równy 21 lat. Jeśli tak, klient może wejść do lokalu, a klauzula then
jest wykonywana. Jeśli nie są wystarczająco stare, wykonywana jest klauzula else
i nie są one wpuszczane.
#!/bin/bash klient_wiek=25 if [ $customer_age -ge 21 ] Następnie echo „Wejdź”. w przeciwnym razie echo "Nie możesz wejść." fi
Skopiuj skrypt z powyższego do edytora, zapisz go jako plik o nazwie „if-age.sh” i użyj polecenia chmod
, aby uczynić go wykonywalnym. Musisz to zrobić z każdym ze skryptów, które omawiamy.
chmod +x if-age.sh
Uruchommy nasz skrypt.
./if-age.sh
Teraz zmodyfikujemy plik i użyjemy wieku poniżej 21 lat.
klient_wiek=18
Wprowadź tę zmianę w swoim skrypcie i zapisz zmiany. Jeśli uruchomimy go teraz, warunek zwróci wartość false i zostanie wykonana klauzula else.
./if-age.sh
Klauzula elif
Klauzula elif
dodaje dodatkowe testy warunkowe. Możesz mieć tyle klauzul elif
, ile chcesz. Są oceniane po kolei, aż jedna z nich okaże się prawdziwa. Jeśli żaden z testów warunkowych elif
nie okaże się prawdziwy, wykonywana jest klauzula else
, jeśli jest obecna.
Ten skrypt prosi o podanie liczby, a następnie informuje, czy jest ona parzysta czy nieparzysta. Zero jest liczbą parzystą, więc nie musimy niczego testować.
Wszystkie inne liczby są sprawdzane przez znalezienie modulo dzielenia przez dwa. W naszym przypadku modulo jest częścią ułamkową wyniku dzielenia przez dwa. Jeśli nie ma części ułamkowej, liczba jest dokładnie podzielna przez dwa. Jest to więc liczba parzysta.
#!/bin/bash echo -n "Podaj liczbę: " przeczytaj numer jeśli [ $liczba -równ. 0 ] Następnie echo "Wpisałeś zero. Zero jest liczbą parzystą." elif [ $(($liczba % 2)) -eq 0 ] Następnie echo "Podałeś $liczbę. To jest liczba parzysta." w przeciwnym razie echo "Podałeś $liczba. Jest to liczba nieparzysta." fi
Aby uruchomić ten skrypt, skopiuj go do edytora i zapisz jako „if-even.sh”, a następnie użyj chmod, aby uczynić go wykonywalnym.
Uruchommy skrypt kilka razy i sprawdźmy jego wyjście.
./jeśli-parzyste.sh
To wszystko działa dobrze.
Różne formy testu warunkowego
Nawiasy kwadratowe ” []
”, których użyliśmy w naszych testach warunkowych, są skrótowym sposobem wywoływania programu test
. Z tego powodu wszystkie porównania i testy, które wspierają test
, są dostępne dla Twojej instrukcji if
.
To tylko kilka z nich:
- ! wyrażenie : Prawda, jeśli wyrażenie jest fałszywe.
- -n łańcuch : Prawda, jeśli długość łańcucha jest większa od zera.
- -z ciąg : Prawda, jeśli długość łańcucha wynosi zero. Oznacza to, że jest to pusty ciąg.
- string1 = string2 : Prawda, jeśli string1 jest taki sam jak string2.
- string1 != string2 : Prawda, jeśli string1 nie jest tym samym co string2.
- integer1 -eq integer2 : Prawda, jeśli liczba całkowita1 jest liczbowo równa liczbie całkowitej2
- integer1 -qt integer2 : Prawda, jeśli liczba całkowita1 jest liczbowo większa niż liczba całkowita2
- integer1 -lt integer2 : Prawda, jeśli liczba całkowita1 jest liczbowo mniejsza niż liczba całkowita2
- -d katalog : Prawda, jeśli katalog istnieje.
- -e plik : Prawda, jeśli plik istnieje.
- -s plik : Prawda, jeśli istnieje plik o rozmiarze większym niż zero.
- -r plik : Prawda, jeśli plik istnieje i ustawione jest uprawnienie do odczytu.
- -w plik : Prawda, jeśli plik istnieje i ustawione są uprawnienia do zapisu.
- -x plik : Prawda, jeśli plik istnieje i ustawione są uprawnienia do wykonywania.
W tabeli „plik” i „katalog” mogą zawierać ścieżki do katalogów, względne lub bezwzględne.
Znak równości „ =
” i test równości -eq
nie są tym samym. Znak równości wykonuje porównanie tekstu znak po znaku . Test równości przeprowadza porównanie numeryczne .
Możemy to zobaczyć za pomocą programu test
w wierszu poleceń.
przetestuj „ten ciąg” = „ten ciąg”
test „ten ciąg” = „ten ciąg”
test 1 = 001
test 1 -równ. 001
W każdym przypadku używamy polecenia echo
, aby wydrukować kod powrotu ostatniego polecenia. Zero oznacza prawdę, jeden oznacza fałsz.
Użycie znaku równości ” =
” daje nam fałszywą odpowiedź porównując 1 do 001. To prawda, ponieważ są to dwa różne ciągi znaków. Liczbowo są one tą samą wartością — jeden — więc operator -eq
zwraca prawdziwą odpowiedź.
Jeśli chcesz użyć dopasowywania symboli wieloznacznych w teście warunkowym, użyj składni podwójnego nawiasu kwadratowego „ [[ ]]
”.
#!/bin/bash jeśli [[ $UŻYTKOWNIK == *ve ]] Następnie echo "Witaj $UŻYTKOWNIKU" w przeciwnym razie echo "$USER nie kończy się na 've'" fi
Ten skrypt sprawdza nazwę konta bieżącego użytkownika. Jeśli kończy się na „ ve
”, drukuje nazwę użytkownika. Jeśli nie kończy się na „ ve
”, skrypt mówi ci o tym i kończy się.
./if-wild.sh
POWIĄZANE: Testowanie warunkowe w Bash: if, then, else, elif
Zagnieżdżone instrukcje if
Możesz umieścić instrukcję if
wewnątrz innej instrukcji if
.
Jest to całkowicie akceptowalne, ale zagnieżdżanie instrukcji if
sprawia, że kod jest mniej czytelny i trudniejszy w utrzymaniu. Jeśli stwierdzisz, że zagnieżdżasz więcej niż dwa lub trzy poziomy instrukcji if
, prawdopodobnie musisz zreorganizować logikę swojego skryptu.
Oto skrypt, który pobiera dzień jako liczbę, od jednego do siedmiu. Jeden to poniedziałek, siedem to niedziela.
Mówi nam o godzinach otwarcia sklepu. Jeśli jest to dzień powszedni lub sobota, informuje, że sklep jest otwarty. Jeśli jest niedziela, informuje, że sklep jest zamknięty.
Jeśli sklep jest otwarty, zagnieżdżona instrukcja if
przeprowadza drugi test. Jeśli dniem jest środa, informuje nas, że jest otwarte tylko rano.
#!/bin/bash # pobierz dzień jako liczbę 1..7 dzień=$(data +"%u") if [ $dzień - le 6 ] Następnie ## sklep jest otwarty jeśli [ $dzień -eq 3 ] Następnie # Środa to połowa dnia echo "W środy otwieramy tylko rano." w przeciwnym razie # regularne dni tygodnia i soboty echo "Jesteśmy otwarci przez cały dzień." fi w przeciwnym razie # nieczynne w niedziele echo "Jest niedziela, jesteśmy zamknięci." fi
Skopiuj ten skrypt do edytora, zapisz go jako plik o nazwie „if-shop.sh” i uczyń go wykonywalnym za pomocą polecenia chmod
.
Uruchomiliśmy skrypt raz, a następnie zmieniliśmy zegar komputera na środę i ponownie uruchomiliśmy skrypt. Następnie zmieniliśmy dzień na niedzielę i uruchomiliśmy go jeszcze raz.
./if-shop.sh
./if-shop.sh
./if-shop.sh
POWIĄZANE: Jak korzystać z testów warunkowych podwójnych nawiasów w systemie Linux
Sprawa For if
Wykonywanie warunkowe jest tym, co zapewnia moc programowaniu i pisaniu skryptów, a skromna instrukcja if
może być najczęściej używanym sposobem przełączania ścieżki wykonywania w kodzie. Ale to nie znaczy, że zawsze jest to odpowiedź.
Pisanie dobrego kodu oznacza wiedzę, jakie masz opcje i które są najlepsze do wykorzystania w celu rozwiązania konkretnego wymagania. Instrukcja if
jest świetna, ale nie pozwól, aby była jedynym narzędziem w twojej torbie. W szczególności sprawdź instrukcję case
, która może być rozwiązaniem w niektórych scenariuszach.
POWIĄZANE: Jak używać instrukcji Case w skryptach Bash