Jak używać instrukcji Bash If (z 4 przykładami)

Opublikowany: 2023-05-08
Laptop z systemem Linux przedstawiający okno terminala z wzorem kuli ziemskiej w tle i binarnym znakiem wodnym
fatmawati achmad zaenuri/Shutterstock
Użyj instrukcji if systemu Linux Bash, aby zbudować wyrażenia warunkowe ze strukturą if 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.

9 Przykłady pętli for w skryptach Linux Bash
POWIĄZANE 9 Przykłady pętli for w skryptach Linux Bash

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 zapisem fi .
  • 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 

Używanie chmod do uczynienia skryptu wykonywalnym

Uruchommy nasz skrypt.

 ./if-age.sh 

Uruchomienie skryptu if-age.sh ze zmienną wieku ustawioną na 25

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 

Uruchamianie skryptu if-age.sh ze zmienną wieku ustawioną na 18

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 

Uruchamianie skryptu if-even.sh z różnymi danymi wejściowymi

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żywanie programu testowego w wierszu poleceń do testowania różnych porównań

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 

Uruchomienie skryptu if-wild.sh pokazującego wyszukiwanie symboli wieloznacznych w teście warunkowym instrukcji if

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 

Uruchomienie skryptu if-shop.sh z zegarem komputera ustawionym na dzień tygodnia, następnie środę, a następnie niedzielę

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