Spis treści
ToggleWstęp
Polecenie Bash printf zapewnia większą elastyczność i opcje formatowania niż polecenie echo podczas pisania w oknie terminala systemu Linux. Nawet osobliwości printf mogą być korzystne.
To jeden z najbardziej fundamentalnych aspektów pracy z oprogramowaniem. Czytasz, co aplikacja napisała na ekranie. Nawet przy wywodzącym się z Uniksa i obsługiwanym przez Linuksa zwyczaju programów wiersza poleceń, które są tak krótkie, jak to tylko możliwe, wiele aplikacji pisze do terminala tylko wtedy, gdy coś pójdzie nie tak. Kluczową podstawą programowania jest informowanie użytkownika o tym, co się dzieje, co się wydarzy lub ostatnio wydarzyło się.
Polecenie echo w powłoce Bash może wypisać tekst na wyświetlaczu terminala. Możesz go używać w skryptach lub w wierszu poleceń i może obsługiwać zmienne i wyświetlać ich wartości, jeśli są zawarte w ciągu. Jaki jest więc sens printf? Czy pisanie tekstu nie jest czymś, o co dba echo? Z drugiej strony, Printf zapewnia więcej niż tylko możliwość pisania ciągów w oknach terminala. Daje dużą wszechstronność, jeśli chodzi o formatowanie danych wyjściowych, i ma kilka dodatkowych sztuczek w rękawie.
Polecenie printf w Bash jest podobne do funkcji printf w C, jednak jest kilka zmian. Musisz być świadomy zmian, jeśli znasz C.
Tworzenie prostych ciągów
Przyjrzyjmy się różnicom między echo i printf, jeśli chodzi o zapisywanie łańcuchów do terminala.
echo oto kilka słów
printf oto kilka słów
Podczas gdy echo wypisuje wszystkie słowa, printf po prostu publikuje pierwsze. Ponadto printf nie wypisuje nowej linii. Dane wyjściowe to smack dab w środku wiersza polecenia. Ale przede wszystkim wszystkie słowa muszą być zacytowane, aby printf na nich zadziałał.
echo oto kilka słów
printf "oto kilka słów"
To krok naprzód. Wydrukowaliśmy wszystkie słowa, ale wciąż czekamy na nową linijkę. Dzieje się tak, ponieważ printf wypisuje nowy wiersz tylko wtedy, gdy sobie tego zażyczysz. Może to zabrzmieć niewygodnie, ale pozwala wybrać, czy chcesz go dodać. Musisz dodać „n” w swoim łańcuchu, aby printf wyemitował nowy wiersz. Sekwencja specjalna „nowa linia” jest tutaj używana.
echo oto kilka słów
printf "oto kilka słów"
Czasem użyjesz nowej linii, a innych nie. W tym przykładzie jedno polecenie printf wykorzystuje nowy wiersz, podczas gdy drugie nie.
printf "Jak to zrobić" && printf "Geekn"
Ponieważ pierwszy printf nie drukuje nowego wiersza, dane wyjściowe z drugiego printf są umieszczane w tym samym wierszu co „Jak to zrobić”. Aby wydrukować nowy wiersz, drugi printf używa n. Wiersz polecenia pojawi się teraz w wierszu pod wydrukowanym tekstem.
Postacie, które uniknęły schwytania
Oto kilka dodatkowych znaków, których można użyć jako ucieczki. Widziałeś już wcześniej, jak działa „n”.
n: Przełącza na nową linię.
r: To polecenie drukuje powrót karetki. Kursor wyjściowy jest zwracany na początek bieżącego wiersza.
t: To polecenie drukuje znak tabulacji.
v: dodaje do strony pionową przestrzeń tabulacji.
\: Drukowany jest znak odwrotnego ukośnika.
“: Wyświetla cudzysłów.
b: Wyświetla znak cofania.
Znak zmiany znaczenia powrotu karetki jest używany do powrotu kursora na początek bieżącego wiersza.
printf "Miód jest źródłem wszelkiego złego pieniądza"
Polecenie printf czyta od lewej do prawej. Dopóki printf nie wykryje znaku ucieczki „r”, ciąg jest pisany jak zwykły tekst. Kursor wyjściowy zostaje przesunięty na początek bieżącego wiersza.
Z literą bezpośrednio pod znakiem „r” przetwarzanie ciągu jest kontynuowane. Pozostała część powoduje, że printf wypisuje „Pieniądze”, co zastępuje frazę „Kochanie”.
Znak odwrotnego ukośnika „” sygnalizuje sekwencje specjalne, podczas gdy znak cudzysłowu „”” służy do cytowania ciągów. Jeśli chcesz wydrukować te znaki, użyj odwrotnego ukośnika, aby je ominąć. Instruuje to printf, że powinny być traktowane jako znaki dosłowne.
printf "To jest tTab, to jest cudzysłów ", a to \ jest ukośnikiem odwrotnym"
Zmienne w działaniu
Użycie zmiennych z printf jest bardzo podobne do użycia zmiennych z echem. Aby dołączyć zmienną, taką jak ta zmienna środowiskowa, użyj przed nią znaku dolara „$”.
printf "Katalog domowy: $HOMen"
Formatowanie ciągów
Ciągi formatujące to ciągi określające format wyjściowy. Podaj tekst ciągu formatu i dodatkowe wartości do pracy jako argumenty.
Tekst, sekwencje specjalne i specyfikatory formatu mogą być zawarte w ciągu formatu.
Specyfikatory formatu Printf informują go, jaki rodzaj argumentu powinien przyjąć, taki jak ciągi, liczby lub znaki.
Poniżej przedstawiono najczęstsze specyfikatory formatu. Symbol procentu „procent” poprzedza je wszystkie. Znak procentu można wydrukować, łącząc dwa znaki procentu „procent procent”.
- %s: Drukuje ciąg.
- %c: Drukuje pojedynczy znak.
- %d: Drukuje liczbę całkowitą.
- %f: drukuje liczbę zmiennoprzecinkową.
- %u: Drukuje liczbę całkowitą bez znaku.
- 1TP2Do: Drukuje wartość w postaci ósemkowej.
- %x: Drukuje wartość wszesnastkowy, małymi literami.
- %X: Drukuje wartość w systemie szesnastkowym, wielkimi literami.
- %e: Drukuje liczbę zmiennoprzecinkową w notacji naukowej, małymi literami.
- %E: Drukuje liczbę zmiennoprzecinkową w notacji naukowej pisanej wielkimi literami.
- %%: Drukuje symbol procentu „%”.
printf "Jak to zrobić %sn" "Geek"
printf "%s%s %sn" "Jak" "-Do" "Geek"
Ciąg formatujący pierwszego polecenia zawiera własną zawartość. Ciąg „Geek” jest wysyłany do printf jako argument. Specyfikator formatu „%s” dopasowuje go i drukuje. Między ciągiem formatującym a ciągiem argumentów jest tylko spacja. W C do ich oddzielenia wymagany byłby przecinek, ale w wersji printf w Bash wystarczy spacja.
Tylko specyfikatory formatu i sekwencja ucieczki nowego wiersza są zawarte w drugim ciągu formatu. Każdy ze specyfikatorów formatu „%s” wykorzystuje kolejno trzy parametry ciągu. Ponownie, w C, przecinek jest wymagany między każdym parametrem, ale funkcja printf Bash pozwala nam zignorować to wymaganie.
Po prostu użyj odpowiedniego specyfikatora formatu, aby wyprowadzić różne rodzaje argumentów. Oto prosta funkcja konwersji liczb oparta na printf. W notacji dziesiętnej, ósemkowej i szesnastkowej wypiszemy liczbę 15.
printf "Grudzień: %dnOct: %onHex: %xn" 15 15 15
Zmniejszmy to trochę, aby przykład był mniej zaśmiecony.
printf "Hex: %xn" 15
Większość z nas jest przyzwyczajona do wyświetlania liczb szesnastkowych pisanych wielkimi literami i z wartościami mniejszymi niż 0x10 poprzedzonymi wiodącym zerem. Możemy to zrobić, umieszczając specyfikator szerokości między znakiem procentu „%” a znakiem „X” i używając specyfikatora formatu szesnastkowego pisanego wielkimi literami „% X”.
Określa rozmiar pola, w którym argument powinien zostać wydrukowany do printf. Do pola dodano spacje. Liczby dwucyfrowe byłyby prezentowane bez żadnego dopełnienia w tym stylu.
printf "Hex: %2Xn" 15
Mamy teraz wielką wartość z zapisaną spacją wiodącą. Umieszczając zero przed tymi dwoma, możemy sprawić, by printf wypełnił pole zerami zamiast spacji:
printf "Hex: %02Xn" 15
Specyfikator dokładności umożliwia określenie liczby miejsc dziesiętnych, które powinny być uwzględnione w danych wyjściowych.
printf "Floating point: %08.3fn" 9.243546
Dzięki temu tworzenie tabel wyników z idealnie dopasowanymi danymi wyjściowymi jest dziecinnie proste. To polecenie wyświetla również inną z cech charakterystycznych Bash printf. Jeśli istnieje więcej argumentów niż specyfikatorów formatu, argumenty są podawane do ciągu formatu w partiach, dopóki wszystkie nie zostaną zużyte. Ilość specyfikatorów formatu w ciągu formatu określa rozmiar partii, która jest przetwarzana w danym momencie. Dodatkowe argumenty wysyłane do funkcji printf w C są ignorowane.
printf "Pływ: %8.3fn" 9.243546 23.665 8.0021
Łańcuchy mogą również wykorzystywać specyfikatory szerokości i precyzji. Za pomocą tego polecenia łańcuchy są drukowane w polu o szerokości 10 znaków.
printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3
Domyślnie wartości w swoich polach są wyrównywane do prawej. Aby wyrównać je do lewej, użyj znaku minus „-
” bezpośrednio za procentem”%
" podpisać.
printf "%-10s %d" "płaszcze" 7 "buty" 22 "Parasole" 3
Specyfikator precyzji pozwala wybrać maksymalną liczbę znaków, które zostaną wydrukowane. Dwukropki „:” są używane do wskazania ograniczeń pola szerokości. Nie w sposób skrócony termin „parasole”.
printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "płaszcze" "buty" "Parasole"
Nawet jako argument można użyć specyfikatora szerokości. Zamiast specyfikatora liczbowego użyj gwiazdki „*” i podaj szerokość jako liczbę całkowitą.
printf "%*sn" 20 "Skrajnie z prawej" 12 "Środek" 5 "Skrajnie na lewo"
Inne dziwactwa i sztuczki
Specyfikatory formatu w ciągu formatu będą działać z wartościami odpowiedniego typu, niezależnie od tego, czy są dostarczane jako zwykłe argumenty w wierszu polecenia, czy tworzone jako wynik wyrażenia.
Spowoduje to wyświetlenie wyniku dodania dwóch liczb:
printf "23+32=%dn" $((23+32))
Liczba folderów w bieżącym katalogu roboczym jest wypisywana za pomocą tego polecenia:
printf "Istnieją katalogi %dn" $(ls -d */ | wc -l)
Polecenie printf drukuje łańcuch, który został zwrócony przez inny program.
printf "Bieżący użytkownik: %sn" $(whoami)
Jeśli specyfikator formatu łańcucha „procent s” nie jest podany z argumentem, printf zwraca wartość null.
printf "Jeden: %s dwa: %sn" "Alfa"
Jeśli wartość liczbowa zostanie podana przez przypadek dla specyfikatora formatu ciągu „% s”, drukuje ją jako ciąg i nie narzeka. Jeśli zrobisz to za pomocą C printf, skończysz z wieloma problemami. Twoje oprogramowanie prawie na pewno ulegnie awarii. Z drugiej strony printf Bash nie wydaje się mieć nic przeciwko.
printf "Jeden: %s dwa: %sn" "Alfa" 777
Jeśli specyfikator formatu liczb całkowitych „% d” nie ma argumentu, wypisywane jest zero.
printf "Liczba całkowita: %dn"
Bash wypisze komunikat o błędzie, a printf wypisze zero, jeśli specyfikator formatu liczby całkowitej „% d” przypadkowo wprowadzi ciąg znaków.
printf "Liczba całkowita: %dn" "Siedem"
Niezręczne symbole można tworzyć, wprowadzając ich numer Unicode, znany również jako „punkt kodowy”. Litera „u” służy do ucieczki niektórych znaków, po której następuje ich wartość Unicode.
printf "Symbol euro: u20ACn"
Aby uwzględnić sekwencje specjalne w ciągach argumentów, użyj specyfikatora formatu „% b” zamiast specyfikatora formatu ciągu „% s” w ciągu formatu.
printf "%s" "u20ACn"
printf "%b" "u20ACn"
Początkowe polecenie printf nie rozpoznaje sekwencji ucieczki nowego wiersza i nie przetwarza wartości Unicode. Specyfikator formatu „% b” jest używany w drugim poleceniu printf. Znak Unicode jest odpowiednio obsługiwany i wyświetlany jest nowy wiersz.
Konie na kursy
Być może będziesz musiał od czasu do czasu wyświetlić jakiś tekst w oknie terminala. Jednak printf jest idealnym narzędziem do zadania, gdy trzeba zastosować pewne pozycjonowanie i formatowanie.
printf "%b" "Tha-" "tha-" "tha-" "to wszystko ludzie.n"