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.