Skrypty powłoki Bash #2 - Jak Gutenberg przykazał
Dzisiaj zajmiemy się “drukowaniem”, czyli wyświetlaniem wyników na ekran i nie tylko.
Zapraszam serdecznie.
Dzień dobry… Dzień dobry… Dzień dobry - odpowiedziało echo.
Mały Książe - Antoine de Saint-Exupéry
Najczęściej używanym programem do drukowania na ekran jest program echo
Jest to prosty program. ale za to bardzo przydatny, wręcz nieoceniony.
Cały opis programu wygląda następująco:
Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-E disable interpretation of backslash escapes (default)
--help display this help and exit
--version
output version information and exit
If -e is in effect, the following sequences are recognized:
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\ONNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)
W przykładnie ósemkowym powinno być 0 zamiast O (problemy techniczne)
Przejdźmy kolejno przez kilka przykładów.
! w przypadku korzystania z WSL niektóre działania jak np. \f mogą nie działać w domyślnym terminalu !
\f
- przejście do kolejnej linii
\r
- tzw powrót karetki (nazwa pochodzi z maszyn do pisania). Wraca na początek linii
\f\r
V \n
- przejście do nowej lini oraz na początek wiersza
\b
- usuwa ostatni znak
\c
- zatrzymuje drukowanie w tym punkcie (włącznie z zakończeniem linii)
\t
- szeroki odstęp horyzontalny
\v
- odstęp wertykalny
\x
,\O
- (powinno być zero) - drukowanie znaków przy użyciu kodów ASCII
Jak widzimy, mamy kilka propozycji użycia programu echo, które mogą pomóc np. przy tworzeniu interfejsów.
echo
ma jeszcze jedną ciekawą funkcję, otóż potrafi wyświetlić pliki zgodne ze wzorcem np.:
Załóżmy, że mamy 677 plików, zbudowanie z wykorzystaniem zakresu [a-z][A-Z].txt .
Chcemy z tego zestawu wyciągnąć pliki, które zaczynają się od e
.
Mamy kilka możliwości, by to uzyskać. Pokażę tylko 3 przykłady, resztę możecie przetestować sami, albo poczekać na post na temat globbingu. :)
e*
- pierwsza litera ‘e’ i dowolne znaki dalej
e[A-Z].???
- pierwsza litera e, następnie litera z zakresu (ASCII) A-Z, kropka i 3 znaki.
e?.txt
- litera e, dowolny znak i zakończenie .txt
echo
w takiej roli potrafi być wredne, ponieważ w przypadku nieznalezienia plików o podanym wzorcu wydrukuje nam ten wzorzec, bez informacji o błędzie.
Na koniec omawiania komendy echo
dodam, że wzorce mogą być zapisane w zmiennych i potem użyte w poleceniu, z wykorzystaniem rozwiązywania wzorców (glob expansion).
Zwykle takie działania są wynikiem błędu lub niewiedzy, tutaj zaś wykorzystujemy to świadomie.
[…] Harmonia i ład, czyli przejrzysta, przemyślana struktura
O typografii i jej nauczaniu-Miesięcznik Znak (07/08.2018)
printf
tym będziemy się zajmować w tej części, czyli drukowaniem sformatowanym.
Jest to program, którego funkcją, tak samo, jak echo
, jest drukowanie na ekranie z tą różnicą, że w przypadku podania złego typu niż zdefiniowany we wzorcu otrzymamy informację o błędzie oraz zostanie zwrócony kod błędu 1.
Opis samego programu wygląda następująco.
Print ARGUMENT(s) according to FORMAT, or execute according to OPTION:
--help display this help and exit
--version
output version information and exit
FORMAT controls the output as in C printf. Interpreted sequences are:
\\" double quote
\ \ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)
\uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)
\UHHHHHHHH
Unicode character with hex value HHHHHHHH (8 digits)
%% a single %
%b ARGUMENT as a string with '\ ' escapes interpreted, except that octal escapes are of the form \0 or \0NNN
%q ARGUMENT is printed in a format that can be reused as shell input, escaping non-printable characters with the proposed POSIX $'' syntax.
and all C format specifications ending with one of diouxXfeEgGcs, with ARGUMENTs converted to proper type first. Variable widths are handled.
Jak widzimy w opisie, większość operacji się pokrywa, z tą różnicą, że printf ma inną notację dla kodów ósemkowych, potrafi drukować z UNICODE oraz formatować komendy by nie były interpretowane, przydatne szczególnie wtedy, gdy budujemy dynamicznie komendę i chcemy, by uruchomiła się ona, dopiero gdy wszystkie elementy się znajdą np. w zmiennej.
Po więcej informacji na temat możliwości printf zapraszam pod 3 stronę manuala => man 3 printf
. Jest tego sporo i zachodzi to trochę na ziemie języka C, dlatego też tutaj się zatrzymam i zostawię to do własnego przestudiowania.
W następnym poście z serii przejdziemy już do rozsławionego przez chyba wszystkie języki programowania programu “Hello World” oraz opowiemy sobie trochę o środowisku uruchomieniowym. Serdecznie zapraszam :)