GNU/Linux >> Znalost Linux >  >> Linux

Použití příkazu Bash printf pro tisk formátovaných výstupů

Nejjednodušší způsob tisku v příkazovém řádku Linuxu je pomocí příkazu echo.

echo "Value of var is $var"

Příkaz echo však nebude adekvátní, když potřebujete vytisknout formátovaný výstup.

Zde vám pomůže příkaz printf. Příkaz bash printf funguje jako příkaz printf v programovacím jazyce C/C++.

printf "My brother %s is %d years old.\n" Prakash 21

Dokážete odhadnout výstup?

První argument %s očekává řetězec, %d očekává dekadické celé číslo, stejně jako C/C++. Nedělejte si starosti, pokud nejste obeznámeni s C/C++.

Nemusíte se to učit jen pro používání příkazu printf ve skriptech Bash. Dovolte mi ukázat vám několik příkladů příkazu Bash printf.

Použití příkazu Bash printf

Začněme nejprve syntaxí.

printf format [arguments]

Zde format je řetězec, který určuje, jak budou zobrazeny následující hodnoty.

V příkladu printf "My brother %s is %d years old.\n" Prakash 21 , celé "Můj bratr %s má %d let.\n" je formát a za ním následují argumenty Prakash a 21 . Argumenty se používají k nahrazení specifikátorů formátu (%s, %d atd.), které vysvětlím později v tomto článku.

Ve své nejjednodušší podobě lze printf použít jako příkaz echo pro zobrazení řetězce.

printf "Hello World\n"

Všimněte si nového řádku znaku \n na konci? Rozdíl mezi příkazem echo a printf je, že echo automaticky přidá nový znak řádku na konec, ale pro printf jej musíte přidat explicitně.

Věnujte zvláštní pozornost typu a počtu argumentů

Mějte na paměti, že formátovací řetězec se snaží použít na všechny argumenty. Proto byste mu měli věnovat zvláštní pozornost.

[email protected]:~$ printf "Hello, %s! \n" Abhishek Prakash
Hello, Abhishek! 
Hello, Prakash!

Podobně byste také měli věnovat pozornost typu specifikátoru formátu, který očekává ve formátovacím řetězci.

Jak můžete vidět ve výše uvedeném příkladu, pokud nenajde zamýšlené argumenty, zobrazí výchozí hodnoty, které jsou null pro řetězce a 0 pro celá čísla.

printf "Hi %s, your room number is %d. \n" Abhishek Prakash 131
bash: printf: Prakash: invalid number
Hi Abhishek, your room number is 0. 
Hi 131, your room number is 0.

Zde je potřeba Abhishek Prakash jako první sadu argumentů a 131 jako druhou sadu argumentů.

Když najde řetězec (Prakash) místo celého čísla, stěžuje si, ale nadále zobrazuje výstup s druhým argumentem na výchozí hodnotě 0.

Podobně vidí 131 jako řetězec ve druhé sadě argumentů a protože druhý argument chybí, je výchozí hodnota 0.

Znaky specifikace formátu

Pro zobrazení výstupu v požadovaném formátu máte k dispozici několik specifikátorů formátu. Zde jsou některé z nejběžnějších:

Postava Použití
%s Řetězec
%c Jeden znak
%d Celá čísla
%o Osmičková celá čísla
%x Hexadecimální celá čísla
%f Plovoucí řádová čárka
%b Řetězec s únikovým znakem zpětného lomítka
%% Znak procenta

Nyní, když jste se seznámili se specifikátorem formátu, pojďme se podívat na několik dalších příkladů, které je ukazují v akci.

Příklady příkazu Bash printf

Nemyslím si, že pro většinu těchto příkladů potřebujete podrobné vysvětlení, protože jsou samozřejmé.

[email protected]:~$ printf "The octal value of %d is %o\n" 30 30
The octal value of 30 is 36

Podívejme se na použití %b specifikátor pro správnou interpretaci znaku uvozeného zpětným lomítkem.

[email protected]:~$ printf "String with backslash: %s\n" "Hello\nWorld!"
String with backslash: Hello\nWorld!

Vidíte pro %s , na tom nezáleží. Ale s %b nový znak escape bude správně interpretován:

[email protected]:~$ printf "String with backslash: %b\n" "Hello\nWorld!"
String with backslash: Hello
World!

Když použijete %c , čte vždy pouze znaky.

[email protected]:~$ printf "Character: %c\n" a
Character: a
[email protected]:~$ printf "Character: %c\n" a b c
Character: a
Character: b
Character: c
[email protected]:~$ printf "Character: %c\n" abc
Character: a

Použití modifikátorů k zobrazení výstupu printf v určitém stylu

Existují modifikátory pro změnu vzhledu výstupu podle vašich představ.

# modifikátor pro osmičková a šestnáctková čísla

Dříve jste viděli použití %o pro převod desítkové soustavy na osmičkovou. Nebylo však příliš jasné, že jde o osmičkové číslo. Můžete použít # modifikátor pro zobrazení osmičkových a šestnáctkových čísel ve správném formátu.

[email protected]:~$ printf "%d is %#o in octal and %#x in hexadecimal\n" 30 30 30
30 is 036 in octal and 0x1e in hexadecimal

Modifikátor mezery pro kladná celá čísla

Můžete použít mezeru mezi % a d v %d zobrazit kladné celé číslo s mezerou na začátku. To pomáhá, když máte sloupec kladných a záporných čísel. Podívejte se, který z nich vypadá „hezčí“:

[email protected]:~$ printf "%d \n%d \n%d \n" 10 -10 10
10 
-10 
10 
[email protected]:~$ printf "% d \n%d \n% d \n" 10 -10 10
 10 
-10 
 10 

Modifikátor šířky

Modifikátor šířky je celé číslo, které určuje minimální šířku pole argumentu.

Ve výchozím nastavení je zarovnán doprava:

[email protected]:~$ printf "%10s| %5d\n" Age 23
       Age|    23

Můžete jej zarovnat doleva přidáním - příznak:

[email protected]:~$ printf "%-10s| %-5d\n" Age 23
Age       | 23

Modifikátor přesnosti

Pomocí modifikátoru přesnosti (.) můžete zadat minimální počet číslic, které se mají zobrazit pomocí %d , %u , %o , %x . Přidá nulové odsazení nalevo od hodnoty.

[email protected]:~$ printf "Roll Number: %.5d\n" 23
Roll Number: 00023

Pokud použijete modifikátor přesnosti s řetězcem, určuje maximální délku řetězce. Pokud je řetězec delší, bude na displeji zkrácen.

[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi

Můžete kombinovat modifikátor šířky i přesnosti:

[email protected]:~$ printf "Name: %.4s\n" Abhishek
Name: Abhi
[email protected]:~$ printf "Name: %10.4s\n" Abhishek
Name:       Abhi

Příklad bonusu:Zobrazení výstupu v tabulkovém formátu pomocí printf

Pojďme to, co jste se naučili o příkazu printf, dobře využít na trochu složitějším příkladu. To ukáže skutečný potenciál příkazu printf ve skriptech bash.

Použijme příkaz printf k tisku následující tabulky pomocí bash:

Jméno ID Věk Známky
Sherlock Holmes 0000122 23 A
James Bond 0000007 27 F
Hercules Poirot 0006811 59 G
Jane Marplová 1234567 71 C

Zde je skript shellu, který jsem napsal pro tento úkol. Váš skript se může lišit:

#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\n"
TableWidth=37

printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades
printf "%.${TableWidth}s\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C

Nyní, když spustím tento skript shellu bash, vytiskne toto:

Není úžasné používat příkaz bash printf k tisku krásně formátovaného výstupu pro vaše skripty?

Doufám, že se vám tento podrobný návod na příkaz printf v Linuxu líbil. Máte-li dotazy nebo návrhy, dejte mi prosím vědět. A nezapomeňte se stát členem Linux Handbook, kde získáte další informace o Linuxu.


Linux
  1. Použití odkazu na proměnnou bashového řetězce v Sed?

  2. Jak zakázat alias v Bash pro jeden příkaz?

  3. Použití příkazu Linux Basename ve skriptech Bash

  1. Příklady použití příkazu tcpdump pro řešení problémů se sítí

  2. Bash skript:Použití příkazu script z bash skriptu pro protokolování relace

  3. Jak zapsat celé číslo do binárního souboru pomocí Bash?

  1. Použití Bash pro automatizaci

  2. Bash ignoruje chybu pro konkrétní příkaz

  3. pomocí náhodného vygenerování náhodného řetězce v bash