GNU/Linux >> Znalost Linux >  >> Linux

Skriptování Bash – Příkaz Printf vysvětlený s příklady

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

Linux
  1. Příkaz vypnutí Linuxu s příklady

  2. Příkaz Linux Traceroute, vysvětlený s příklady

  3. '&&' vs. '&' s příkazem 'test' v Bash

  1. Bash HereDoc výukový program s příklady

  2. Linux cut Command Vysvětlení pomocí 6 příkladů

  3. Příkaz Bash printf

  1. Příkaz Linux ldd vysvětlený s příklady

  2. Příkaz Bash Echo vysvětlený s příklady v Linuxu

  3. Skriptování Bash – smyčka dokud a dokud vysvětlená s příklady