V tomto článku vysvětlím základní použití Bash printf příkaz s příklady v Linuxu. Na konci tohoto článku budete pohodlně používat příkaz printf ve skriptování shellu Bash.
Příkaz Bash printf
Bash nabízí dva typy příkazů, které lze použít k vytištění vašeho výstupu na terminál. Jedním z nich je echo příkaz, který se většinou používá k tomuto účelu. Druhým je printf příkaz.
Printf
je podobná funkci printf v C jazyk, ale s vlastní sadou funkcí. Hlavní rozdíl mezi echo
a printf
příkaz je, že printf
nabízí formátování a další funkce ve srovnání s echo
příkaz.
Pokud jste nepoužili echo
příkaz dříve, máme o něm podrobný článek, na který byste se měli podívat.
- Příkaz Bash Echo vysvětlený s příklady v Linuxu
Printf
je vestavěný shell, ale můžete také najít externí příkaz pro printf
. Builtin má přednost před externím příkazem. Tyto informace získáte spuštěním type
příkaz, jak je znázorněno níže.
$ type -a printf printf is a shell builtin printf is /usr/bin/printf printf is /bin/printf
Další podrobnosti o type
naleznete v následující příručce:
- Výukový program příkazu typu s příklady pro začátečníky
Pokud chcete spustit externí verzi printf
, musíte ukázat na úplnou cestu k adresáři, kde se nachází binární soubor.
$ printf "Hello World\n" # SHELL BUILTIN
$ /usr/bin/printf "Hello World\n" # EXTERNAL VERSION OF PRINTF

Zobrazit nápovědu k tisku Bash
Jak jsem zmínil v předchozí části, printf
je vestavěný bash. Musíte otevřít bash
manuálovou stránku a přejděte na printf
sekce.
$ man bash
/printf → presss

Můžete také spustit následující příkaz, který zobrazí nápovědu printf
z bash
manuálová stránka.
$ man bash | less --pattern='^ *printf +['
Základní forma příkazu printf
V příkladech budu porovnávat printf
s echo
příkaz k pochopení společného.
Níže je uveden formát pro printf
příkaz:
printf [-v var] format [arguments]
Argumenty by měly být předány printf
jinak selže, jak je znázorněno na obrázku níže.
$ printf
$ echo $?

Předejte argument a spusťte printf
příkaz znovu. Z níže uvedeného příkladu můžete vidět, že jsem přidal \n, což je znak nového řádku. Ve výchozím nastavení printf
nepřidá nový řádek jako echo
příkaz, takže musíte přidat \n
.
$ printf "Linux is fun to work with" # WITHOUT NEW LINE
$ printf "Linux is fun to work with\n" # WITH NEW LINE

Proměnné a interpretace příkazů
Do printf
můžete uzavřít libovolné proměnné nebo spustit příkazy prohlášení. Toto chování je podobné jako echo
příkaz.
$ VAR1="Linux"
$ printf "$VAR1 is fun to work with\n"

Doporučené čtení:
- Bash Scripting – proměnné vysvětlené na příkladech
Chování jednoduchých a dvojitých uvozovek
Když své argumenty uzavřete do jednoduchých uvozovek, proměnná a příkaz budou považovány za prostý text. Toto je stejné chování v echo
příkaz také. Pokud chcete, aby byla proměnná a příkaz rozšířeny, musíte argumenty uzavřít do dvojitých uvozovek.
$ printf '$VAR1 is fun to work with\n'
$ printf 'Today date = $(date)\n'

Když předáte argumenty bez uvozovek, printf
bude považovat pouze první slovo za argument a vytiskne jej. Takže pomocí uvozovek kolem printf
je nutné.
$ printf Today date = $(date)\n

Přesměrování a propojení výstupu
Ve výchozím nastavení printf
odešle výstupy na stdout (terminál). Výstup můžete přesměrovat do souboru pomocí operátoru přesměrování nebo jej zkombinujte s operátorem potrubí k dalšímu zpracování.
# PRINT TO STDOUT $ printf "Today date = $(date)\n"
# REDIRECT TO A FILE $ printf "Today date = $(date)\n" > /tmp/tdy.txt $ cat /tmp/tdy.txt
# PIPE $ printf "Today date = $(date)\n" | grep -i -o IST

Související čtení:
- Přesměrování Bash vysvětleno na příkladech
Přiřazení výstupu k proměnné
Někdy můžete chtít uložit printf
výstup do proměnné a použít ji později pro nějaké zpracování. Normálně spustíte printf
uzavřený v závorkách, které spustí příkaz a přiřadí výstup proměnné.
$ ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
$ printf $ZONE

Případně můžete použít -v
příznak spolu s printf
pro uložení výstupu do proměnné. Název proměnné musíte předat za -v
vlajka.
$ printf -v TIME "Today date = $(date)\n" $ echo $TIME

Příkaz víceřádkového printf
Pokud chcete vytisknout více než jeden řádek, můžete text uzavřít do dvojitých uvozovek. Podobně, pokud máte velký řádek, který se má vytisknout jako jeden řádek, a přejete si napsat řádek ve více řádcích pro lepší čitelnost kódu, můžete na konci každého řádku použít zpětné lomítko, kde další řádek bude považován za pokračování na předchozí řádek.
$ printf "\n I am running PoP_OS
It is a great OS
With Great features\n"
$ printf "I am running pop_os \
It is a great OS \
With Great features\n"

Uvedené znaky zpětného lomítka
V printf
můžete použít následující znaky s escapováním zpětného lomítka .
- Znak nového řádku (\n)
- Karta Vodorovně (\t) a Svisle (\v)
- Znak backspace (\b)
- Návrat vozíku (\r)
Pojďme diskutovat jeden po druhém s příklady.
Znak nového řádku (\n)
Již jsme viděli o novém znaku řádku (\n
) ve všech předchozích částech. Znak nového řádku (\n
) přidá nový řádek.
$ printf "Today date = $(date)\n"

Vodorovná karta (\t) a svislá karta (\v)
Vodorovné a svislé znaky tabulátoru se používají k přidání mezer tabulátoru do vašeho printf
argumenty.
$ printf "Today date \t $(date)\n" # HORIZONTAL TAB
$ printf "Today date \v $(date)\n" # VERTICAL TAB

Znak backspace (\b)
Znak backspace (\b
) odstraní jedno písmeno. Je to jako stisknutí klávesy Backspace na naší klávesnici.
$ printf "It's a rain\by day..\n"

Vrácení vozíku (\r)
Při návratu vozíku se kurzor vrátí zpět na první pozici (\r
) se používá. Cokoli následuje po \r
bude nahrazovat znaky z první pozice.
$ printf "It's a rain\by\r day..\n"

Escape znak zpětného lomítka (\)
Pokud chcete speciální znaky (\n
, \t
, \v
, \b
, \r
) a zacházejte s ním jako s řetězcem, poté jej předponujte dvojitými zpětnými lomítky (\\
).
$ printf "It's a rain\\by\\r day..\n"

Ať už jste dosud viděli cokoli, stejnou sadu operací najdete v echo
příkaz také. Pokud již znáte echo
příkazem, do této doby byste se s printf
již velmi dobře orientovali také příkaz.
Specifikátory formátu Printf
Specifikátory formátu představují způsob, jak nahradit hodnotu v printf
místo pevného zakódování hodnoty v printf
. Existuje mnoho písmen, která se používají k nahrazení, a každé písmeno představuje určitý datový typ. Při použití specifikátoru jej musíte předponu %
symbol. Podívejme se na některé z běžně používaných specifikátorů formátu.
Specifikátor řetězce (%s)
Pokud chcete do printf
umístit nějaké řetězce , musíte použít %s
. Podívejte se na níže uvedený příklad. Mám printf
a chci nahradit hodnotu "United" uvnitř printf
. Takže %s
se používá, což je specifikátor řetězce a při spuštění příkazu hodnota "united" bude nahrazeno místo %s
.
$ printf "++ Manchester %s has a strong lineup this season" "United"

Můžete předat tolik substitučních argumentů, kolik chcete, a v argumentu musíte použít stejný počet specifikátorů.
$ printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"

Co když se použije méně specifikátorů a více argumentů?
Podívejte se na níže uvedený příklad. Na začátku jsem použil pouze jeden specifikátor a předal jsem tři argumenty (řetězce), které mají být nahrazeny. Způsob printf
zachází s tímto, začne nahrazovat první argument v prvním specifikátoru a další argument bude znovu předán prvnímu specifikátoru, protože žádné další specifikátory nejsou. Tímto způsobem dojde ke třem substitucím, které ve skutečnosti nejsou správné a výsledek, který chceme.
$ printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"

Existují případy použití, kdy toto chování dává smysl. Podívejte se na níže uvedený příklad. Přál bych si vytisknout uvítací zprávu pro některé hráče a předat jejich jména jako argumenty. Normálně můžete uložit seznam jmen do pole a procházet polem a vytisknout zprávu. Ale toto je efektivní způsob, jak dosáhnout výsledku tím, že se vyhnete používání smyček.
$ printf "++ Welcome %s to manchester united\n" "Ronaldo" "Varane" "Jadon Sancho\n" ++ Welcome Ronaldo to manchester united ++ Welcome Varane to manchester united ++ Welcome Jadon Sancho to manchester united

Desetinné celé číslo se znaménkem (%d) a celé číslo bez znaménka (%u)
Chcete-li nahradit jednotlivá celá čísla, použijte %d
.
$ printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25

Chcete-li nahradit celá čísla bez znaménka, použijte %u
.
$ printf "UNSIGNED INTEGER = %u\n" 10

Pokud se pokusíte nahradit jakýkoli datový typ jiný než celé číslo, zobrazí se chyba.
$ printf ">> Ronaldo gets no %d\n" seven

Číslo s plovoucí desetinnou čárkou (%f)
Chcete-li nahradit čísla s pohyblivou řádovou čárkou, použijte %f
.
$ printf "Integer 100 to floating-point %f\n" 100

Interpretace sekvence escape zpětného lomítka
Jako argumenty můžete předat sekvence escape zpětného lomítka a použít %b
který bude interpretovat a rozšiřovat sekvenci escape zpětného lomítka.
$ printf "Welcome to %b Manchester united %b" "\v" "\n"

Směrnice pro převod Printf
Existují volitelné modifikátory převodu, které lze použít k formátování printf
výstupy.
%[flags][width][.precision]specifier
Modifikátor šířky
O minimálním počtu znaků při převodu rozhoduje modifikátor šířky. Pokud je počet znaků menší, budou předpony mezery, jak je uvedeno níže.
$ printf "%10s\n" "Ronaldo"

Pokud se podíváte na obrázek výše, specifikátor (Ronaldo) je 7 znaků a zadal jsem šířku na 10 . V tomto případě přidá mezery pro zarovnání šířky 10 .
Můžete také použít modifikátory příznaků k zarovnání zarovnání nebo přidat nuly místo mezer. Pokud je například potřeba výstup zarovnat doleva, můžete přidat spojovník (-
) modifikátor příznaku.
$ printf "%-10s\n" "Ronaldo"

V případě celých čísel a hodnot s plovoucí desetinnou čárkou můžete mezeru nahradit nulami přidáním modifikátoru příznaku nula (0).
$ printf "%010d \n" 7

Modifikátor přesnosti
Toto je volitelný parametr, který lze použít k rozhodnutí o počtu tištěných řetězců, celých čísel a pozic s plovoucí desetinnou čárkou. Musíte použít tečku(.) následované celým číslem, které určí počet pozic, které se mají vytisknout.
Podívejte se na níže uvedený příklad. Používám specifikátor řetězce a nastavím modifikátor přesnosti na čtyři.
$ printf "%.7s\n" "Ronaldo has joined Manu"

Hvězdičky (*
) lze předat místo přesných celočíselných hodnot. Hvězdičky přijmou argument pro přesnost namísto pevného kódování hodnoty přesnosti.
$ printf "%.*s\n" 7 "Ronaldo has joined Manu"

Závěr
V tomto článku jsme probrali poměrně dost informací o příkazu Bash printf. Chcete-li použít printf
pohodlně si procvičte všechny příklady uvedené v článku. Printf je ve formátování mnohem výkonnější než příklady, které jsem ukázal v tomto článku. Pokud jste spokojeni se základy, v závislosti na případu použití můžete použít printf
efektivně.
Související čtení:
- Skriptování Bash – indexované pole s příklady
- Bash Scripting – Asociativní pole vysvětleno s příklady
- Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady
- Bash Scripting – pro smyčku vysvětlenou s příklady
- Bash Scripting – funkce vysvětlené na příkladech
- Výukový program Bash Heredoc pro začátečníky