Sposób, w jaki nauczyłem się jakiegokolwiek języka, to nie usiąść i przeczytać książkę o nim tylko po to, aby się go nauczyć, ale aby mieć cel w głowie:
Chcę zautomatyzować X.
Wtedy zaczynam myśleć o problemie, a następnie używam Internetu, aby dowiedzieć się o składni, która doprowadzi mnie z punktu A do punktu B.
Na przykład, lata temu chciałem śledzić czas działania mojego systemu, kiedy właśnie przeniosłem się z Windowsa, który musiał być restartowany co 48 godzin, a także dlatego, że byłem wielkim nerdem. Drażniłem się z przyjacielem online, więc chciałem aktualizować czas pracy mojego systemu tutaj w domu, na stronie internetowej, która była hostowana w Internecie, na serwerze w innym stanie.
Jak to zrobić?
Po pierwsze, jak zacząć tworzyć skrypt, który będzie działał.
#!/bin/bash <- Oh, specifies the script interpreter. LEARNED.
Hm, nadal nie działa…
# chmod +x <- Oh, needs execute bit set. LEARNED.
Teraz, jak złapać uptime? Cóż, mógłbym rozdzielić komendę uptime, ale jedną z funkcji, którą chciałem uzyskać było śledzenie mojego „rekordowego czasu pracy”. Polecenie uptime Linuksa wyświetla uptime w formie czytelnej dla człowieka:
13:23:54 up 32 days, 4:19
Cóż, to jest trochę szorstkie do parsowania jako większe niż lub mniejsze niż. Można to zrobić, ale musi być jakiś prostszy sposób. Zastanawiam się, skąd program „uptime” czerpie te dane? Trochę googlowania wprowadza mnie do systemu /proc:
/proc/uptime
Jak to odczytać? Jest kilka sposobów. Sposób, którego użyłem z przyzwyczajenia (i prawdopodobnie jest to zły sposób, jako że komenda cat nie jest do tego przeznaczona) to:)
cat /proc/uptime
, który zwraca:
2780345.41 5546896.19
OK, teraz mamy ładne wartości dziesiętne, które ułatwiają zorientowanie się, czy jest to rekordowy uptime. Ale jak mogę to przechwycić w zmiennej? Przeczytałem trochę więcej online o backquotes:
UPTIME=`cat /proc/uptime`
Cool, teraz mam to w zmiennej. Mentalna uwaga, możesz czytać różne ciekawe rzeczy do zmiennych w ten sposób. Muszę o tym pamiętać w przyszłości. NAUCZYŁEM SIĘ. Poza tym, o co chodzi z tym /proc? Ooh, wszystkie rodzaje dobrych rzeczy tam jak:
cat /proc/cpuinfo
OK więc teraz mam tę wielką liczbę dziesiętną. Jak to przeliczyć na dni, żeby mieć czas pracy jak „23.8 dni”? Również cat /proc/cpuinfo zwraca dwie liczby. Którą chcę? I jak to rozdzielić, żeby mieć tylko tę liczbę? Poczytałem trochę więcej. Teraz jest kilka sposobów na rozdzielenie ciągu znaków, ale pierwszą rzeczą, na którą się natknąłem jest polecenie cut. Jak mogę jej użyć z ciągiem? Przeczytałem artykuł o piping i przekierowaniu. Widzę, że dwie liczby są oddzielone spacją jako ogranicznik, więc:
NUMBERIWANT=`echo ${uptime} | cut -d " " -f 1`
Cool. Muszę to zapamiętać. Mogę zrobić ciekawe rzeczy z tą rurą. Składam to mentalnie, razem z komendą cut, która będzie jednym z najbardziej użytecznych narzędzi wiersza poleceń, z jakimi się zetknąłem.
Teraz, jak zamienić to w dni…hm, rozczarowujące, bash ma gównianą obsługę matematyki. Hm, ten artykuł mówi o bc. Trochę eksperymentów i:
uptime=`echo "scale=2; $uptime/86400" | bc`
Więc bc jest programem używanym do wykonywania obliczeń. Będę musiał o tym pamiętać. Nauczyłem się o cudzysłowach i potoku w poprzednich krokach, więc było oczywiste, jak tego użyć tutaj.
Teraz jak mam to wyeksportować do pliku tekstowego, którego mogę użyć jako include PHP na stronie internetowej (PHP nauczyłem się w ten sam sposób)?
Ach, przekierowanie!
echo $uptime > ./uptime.txt
I tak dalej. Jeśli spojrzę na moje stare skrypty (w tym jeden), kodowanie jest nieefektywne i niekoniecznie tak jak ja bym to zrobił teraz. Ale gdy podążam za tym procesem przez lata, moje umiejętności i zestaw wiedzy poprawiają się, a przez malowanie się w rogi przez złe praktyki, uczę się, jak nie robić rzeczy. Moje metodologie poprawiają się tak, że skrypty są łatwiejsze w utrzymaniu – nie przez siedzenie w klasie lub czytanie książek, ale przez wkręcanie siebie i uczenie się na tym.
UWAGA: Nie jestem profesjonalnym programistą. Piszę skrypty głównie dla moich własnych (hobbystycznych) celów. Wiem, że ludzie z wykształceniem informatycznym mogą mieć zastrzeżenia do tej metody uczenia się, ale jak dotąd sprawdza się ona dobrze w moim przypadku. I jest to świetna zabawa, ponieważ zamiast być tylko rodzajem codziennych ćwiczeń w czytaniu i zapamiętywaniu, dostaję coś „z tego”, gdy idę — użyteczne skrypty.
Przy okazji — załóż zakładkę, jeśli jeszcze tego nie zrobiłeś. To jest fantastyczne:
Advanced Bash Scripting Guide — większość tego, co wiem o bashu, pochodzi stąd.