Czy Bash może być ładniejszy?
Instrukcja if
Instrukcja if
jest podstawowym narzędziem programisty, nie tylko w skryptach bashowych ale w całym programowaniu. Są bardzo często używane w skryptach powłoki, chociaż w wielu przypadkach można je zastąpić czymś znacznie bardziej eleganckim i czytelnym.
W tym wpisie pokażemy, jak zamiast tego można użyć operatorów sterujących. Wielu prawdopodobnie o tym słyszało, ale nie zdaje sobie sprawy, jak wydajnie z nich korzystać – a przez to ich nie stosuje. Tymczasem taka wiedza pomoże Ci w przyszłości pisać czytelniejsze skrypty.
Oto jak wyglądają proste instrukcje if
w bashu:
if [ expression ]
then
command
fi
# or
if [ expression ]; then command; fi
No musi się z tym coś dać zrobić…
Operatory sterujące
Bash oferuje tzw. operatory sterujące (control operators) do tworzenia sekwencji poleceń. Niektóre z nich są warunkowe i pozwalają na logiczne rozgałęzianie na podstawie tego co zwróciła nam ostatnio wydana komenda.
Skoncentrujemy się tylko na tych dwóch operatorach logicznych:
- &&: operator AND - uruchom następujące polecenie tylko wtedy, gdy poprzednie się powiodło
- ||: operator OR - uruchom następujące polecenie tylko wtedy, gdy poprzednie nie powiodło się
Kody wyjścia programu
Możesz się teraz zastanawiać, skąd bash wie czy polecenie się powiodło. Tutaj na scenę wchodzą właśnie kody wyjścia programu. Gdy program kończ swoje działanie, zwracany jest numeryczny kod statusu. Wartość 0 oznacza, że program się powiódł, każda inna wartość oznacza niepowodzenie.
Kod wyjścia jest zwykle ukryty przed użytkownikiem. Stan ostatniego polecenia uruchomienia jest przechowywany w zmiennej ?
. Możesz to sprawdzić, wywołując proste polecenie echo $?
. Na przykład listowanie z ls zwykle zwraca 0, ale ta wartość będzie inna jeśli katalog nie istnieje lub wystąpił błąd.
ls ~/ # exit code: 0
ls ~/nieistniejący_katalog # exit code: 2
Będzie to działać podobnie w przypadku właściwie każdego programu.
Łączymy to w łańcuchy poleceń
Przyjrzyjmy się kilku przykładom, aby pokazać, jak można użyć tych operatorów sterujących.
Wyobraź sobie, że chcesz pobrać plik ~/.profile
, ale tylko wtedy, gdy można go odczytać:
if [ -r ~/.profile ]; then
source ~/.profile
fi
Możemy to uprościć za pomocą operatorów sterujących: [ -r ~/.profile ] && . ~/.profile
.
Tylko jeśli wyrażenie sprawdzające możliwość odczytania plików powiedzie się (potwierdzi możliwość odczytania plików) będziemy chcieli pobrać plik. Więc używamy operatora &&
.
Sprawdź oferty pracy na TeamQuest
Aby wymagać wywołania użytkownika jako root, możemy wykonać następujące czynności: [ $EUID -ne 0 ] && echo You must be root && exit 1
. Polecenie echo zwraca wartość 0, więc zaraz po nim wykona się exit
.
Jeśli chcielibyśmy wydrukować zawartość naszego pliku profilu z komunikatem o powodzeniu lub komunikatem o błędzie przy błędzie odczytu, możemy wykonać następujące czynności: cat ~/.profile && echo This is your profile || echo Failed to read profile
.
Możesz tworzyć te sekwencje poleceń na przykład do tworzenia skryptów instalacyjnych, które przechodzą przez szereg kroków. Możesz zdefiniować funkcje basha dla każdego kroku i zaaranżować instalację w następujący sposób: init && configure && install && cleanup || echo Install failed
.
To teraz czas przypomnieć sobie jak wygląda szukanie plików z linii poleceń.