Dom Badanie Jak korzystać z polecenia printf Bash w systemie Linux?

Jak korzystać z polecenia printf Bash w systemie Linux?

za pomocą Frank
Opublikowany: Ostatnia aktualizacja

Wstę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

Używanie echa i printf z niecytowanymi słowami

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"

Używanie echa i printf z cytowanymi słowami

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"

Używanie echa i printf z cytowanymi słowami i znakiem nowej linii

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"

Używanie dwóch printfs do utworzenia jednej linii tekstu

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"

Używanie znaku powrotu karetki, aby przejść z powrotem na początek wiersza

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"

Uciekające postacie, by były traktowane dosłownie

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"

Używanie printf ze zmienną środowiskową

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"

Pokazywanie printf akceptujących "zbyt wiele" argumentów

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

używanie printf do drukowania wartości liczbowych w różnych notacjach podstawowych

Zmniejszmy to trochę, aby przykład był mniej zaśmiecony.

printf "Hex: %xn" 15

Drukowanie wartości szesnastkowej

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

drukowanie wartości szesnastkowej pisanej wielkimi literami w polu o szerokości 2 znaków

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

drukowanie wartości szesnastkowej wielkimi literami w polu o szerokości 2 znaków uzupełnionym zerami

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

Używanie modyfikatorów szerokości i precyzji z liczbą zmiennoprzecinkową

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

Używanie modyfikatorów szerokości i precyzji do stworzenia schludnego stołu

Ł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

Używanie modyfikatora szerokości ze stringami

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

Korzystanie z wyrównanego do lewej specyfikatora szerokości z ciągami

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"

Używanie modyfikatora precyzji do ograniczenia liczby znaków, które są drukowane z ciągu

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"

Przekazywanie specyfikatora szerokości jako argumentu do printf

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))

Drukowanie sumy dwóch liczb

Liczba folderów w bieżącym katalogu roboczym jest wypisywana za pomocą tego polecenia:

printf "Istnieją katalogi %dn" $(ls -d */ | wc -l)

Liczenie katalogów z printf

Polecenie printf drukuje łańcuch, który został zwrócony przez inny program.

printf "Bieżący użytkownik: %sn" $(whoami)

Drukowanie danych wyjściowych z innego polecenia

Jeśli specyfikator formatu łańcucha „procent s” nie jest podany z argumentem, printf zwraca wartość null.

printf "Jeden: %s dwa: %sn" "Alfa"

Jak printf radzi sobie z brakującymi argumentami ciągu?

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

Jak printf po cichu akceptuje liczby całkowite jako wartości łańcuchowe?

Jeśli specyfikator formatu liczb całkowitych „% d” nie ma argumentu, wypisywane jest zero.

printf "Liczba całkowita: %dn"

Jak printf radzi sobie z brakującymi argumentami całkowitymi?

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"

Jak printf traktuje łańcuchy, które są dostarczane zamiast argumentów całkowitych?

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"

Drukowanie wartości Unicode ze znakami ucieczki

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"

Używanie specyfikatora formatu %b do obsługi sekwencji specjalnych w argumentach ciągu

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"

Może Ci się spodobać

Navhow poświęcona jest nauczaniu ludzi na całym świecie, jak robić cokolwiek.

 

Subskrybuj

Najlepszy biuletyn informacyjny w dowolnym miejscu

©2022 Navhow, Wszystkie prawa zastrzeżone