Tips en Trucs 2023

Echo

Wanneer je als beginner met Bash scripts gaat werken, is de eerste opdracht die je waarschijnlijk zult leren en gebruiken de echo opdracht. Je kunt de bash echo opdracht vergelijken met de print opdracht in andere programmeertalen. De echo opdracht is een in bash ingebouwde opdracht en het doel ervan is om de uitvoer af te drukken naar stdout (Terminal).

Ingebouwde of externe echo opdracht

In Linux en andere Unix-achtige systemen worden sommige opdrachten als zowel built-ins als externe opdrachten aangeboden. De /bin/echo is bijvoorbeeld een externe opdracht die dezelfde naam heeft als de echo bash built-in.

Als we een opdracht uitvoeren dat zowel als builtin en als externe opdracht bestaat, wordt meestal standaard de ingebouwde opdracht uitgevoerd. Omdat de voorrangsvolgorde voor opdrachtnamen is: alias, dan functie, dan ingebouwde en dan externe opdracht in de mappen die in $PATH staan in volgorde.

Als je een externe opdracht wilt forceren dat beschikbaar is als zowel ingebouwde als externe opdracht, gebruik dan gewoon het volledige pad.

Om dit duidelijk te maken, voert het volgende voorbeeld de in bash ingebouwde echo opdracht uit:

dany@pindabook:~$ echo PindaNet
PindaNet

En het volgende voert de externe echo opdracht uit:

dany@pindabook:~$ /bin/echo PindaNet
PindaNet

Om uit te zoeken of een opdracht een ingebouwde of externe opdracht is, kunnen we de type opdracht gebruiken:

dany@pindabook:~$ type echo
echo is een ingebouwde shell-functie

Gebruik de -a optie om alle locaties weer te geven die het opgegeven uitvoerbare bestand bevatten:

dany@pindabook:~$ type -a echo
echo is een ingebouwde shell-functie
echo is /usr/bin/echo
echo is /bin/echo

Bash echo help

Bijna alle Linux-opdrachten hebben een man pagina of helpsectie om te begrijpen hoe je die opdracht moet gebruiken. De handleiding van de echo opdracht is opgenomen in de Bash handleiding.

Om de man pagina voor bash weer te geven, voer je de volgende opdracht uit:

dany@pindabook:~$ man bash

Typ nu /echo en druk op de toets n tot je de helpsectie van de echo opdracht ziet.

       echo [-neE] [arg ...]
              Output the args, separated by spaces, followed by a newline.  The return status is 0 unless a write error occurs.  If
              -n is specified, the trailing newline is suppressed.  If the -e option is  given,  interpretation  of  the  following
              backslash-escaped  characters is enabled.  The -E option disables the interpretation of these escape characters, even
              on systems where they are interpreted by default.  The xpg_echo shell option may be  used  to  dynamically  determine
              whether  or  not  echo expands these escape characters by default.  echo does not interpret -- to mean the end of op‐
              tions.  echo interprets the following escape sequences:
              \a     alert (bell)
              \b     backspace
              \c     suppress further output
              \e
              \E     an escape character
              \f     form feed
              \n     new line
              \r     carriage return
              \t     horizontal tab
              \v     vertical tab
              \\     backslash
              \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
              \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
              \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
              \UHHHHHHHH
                     the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Sluit de handleiding met de toets q. Je kunt ook de volgende one-liner opdracht gebruiken om de helpsectie van de echo opdracht weer te geven:

dany@pindabook:~$ man bash | less --pattern='^ *echo +\['

Echo gebruiken

De echo opdracht accepteert optionele opties en de tekst die naar stdout moet worden afgedrukt (weergegeven).

Je kunt het volgende stukje code rechtstreeks in de terminal uitvoeren of een scriptbestand maken en het dan uitvoeren. Ik ga het rechtstreeks in de terminal uitvoeren:

dany@pindabook:~$ echo "Dag allemaal"
Dag allemaal

Kijk eens naar het bovenstaande voorbeeld. Het is het traditionele Dag allemaal (hello world) programma dat we altijd gebruiken als we een nieuwe taal leren en als eerste code uitvoeren. De echo opdracht hier accepteert de tekst "Dag allemaal" en print het naar de terminal (Stdout).

Nieuwe regels onderdrukken

Het standaard gedrag van de echo opdracht is, dat het automatisch een nieuwe regel toevoegt (\n). Start de volgende opdracht en zie dat de terminal prompt op een nieuwe regel wordt weergegeven.

dany@pindabook:~$ echo "Dag allemaal"
Dag allemaal
dany@pindabook:~$

Als je dit gedrag nu wilt onderdrukken, kun je de optie -n gebruiken die de nieuwe regel zal onderdrukken en de terminal prompt zal op dezelfde regel worden afgedrukt zoals hieronder getoond.

dany@pindabook:~$ echo -n "Dag allemaal"
Dag allemaaldany@pindabook:~$

Echo zonder argumenten

Als er geen argument wordt doorgegeven aan de echo opdracht, zal de opdracht niet falen maar een lege nieuwe regel teruggeven. Start je terminal en voer echo uit en je zult zien dat het gewoon een lege regel afdrukt en afsluit.

dany@pindabook:~$ echo

dany@pindabook:~$

De omgevingsvariabele $? bevat de status van de laatst uitgevoerde opdracht. Indien deze de waarde 0 bevat is de opdracht zonder fouten uitgevoerd, andere waarden zijn foutcodes:

dany@pindabook:~$ echo $?
0

Je kunt dit gedrag opheffen door de -n optie toe te voegen, waardoor er geen nieuwe regel (newline) wordt afgedrukt, zelfs als er geen tekst wordt doorgegeven.

dany@pindabook:~$ echo -n
dany@pindabook:~$

Waar zal dit nuttig zijn? Je vraagt het je misschien af. Als je wat lege regels tussen je uitvoer wilt, kun je echo zonder argumenten gebruiken.

Werken met variabelen en opdrachten

De echo opdracht zal door de gebruiker gedefinieerde en/of shell variabelen interpreteren die als argument worden doorgegeven en de waarde afdrukken. Kijk eens naar de onderstaande voorbeelden.

Eerst wordt de omgevings(env)variabele SHELL doorgegeven aan de echo opdracht en deze drukt de waarde van de variabele af.

dany@pindabook:~$ echo "Op dit moment gebruik ik ${SHELL}"
Op dit moment gebruik ik /bin/bash

Ten tweede wordt de door de gebruiker gedefinieerde variabele OS doorgegeven aan de echo opdracht en de waarde wordt afgedrukt naar de terminal.

dany@pindabook:~$ OS="Debian 12 Bookworm"
dany@pindabook:~$ echo "Ik gebruik ${OS}"
Ik gebruik Debian 12 Bookworm

Je kunt ook opdrachten uitvoeren binnen de argumenten. Bekijk het onderstaande voorbeeld waarbij de opdracht uname -r als argument wordt doorgegeven en de opdracht wordt uitgevoerd (geïnterpreteerd) en de uitvoer ervan wordt afgedrukt.

dany@pindabook:~$ echo "KERNEL_VERSION=$(uname -r)"
KERNEL_VERSION=6.1.0-12-amd64

Enkele en dubbele aanhalingstekens

In alle voorgaande voorbeelden is het je misschien opgevallen dat ik dubbele aanhalingstekens rond de argumenten heb gebruikt. Wat gebeurt er als het argument niet tussen aanhalingstekens staat? De echo opdracht zal niet mislukken en je krijgt dezelfde uitvoer.

Kijk eens naar het volgende voorbeeld. Ik voer dezelfde opdracht uit die ik in de vorige sectie heb gebruikt, maar zonder aanhalingstekens en de uitvoer wordt zonder fout afgedrukt.

dany@pindabook:~$ echo Ik gebruik ${OS}
Ik gebruik Debian 12 Bookworm

Een goede gewoonte is om de argumenten altijd tussen aanhalingstekens te zetten.

Als het argument platte tekst is, kun je enkele of dubbele aanhalingstekens gebruiken. Maar als je een opdracht wilt uitvoeren of een variabele in het argument wilt uitbreiden, moet je dubbele aanhalingstekens gebruiken, geen enkele.

Enkele aanhalingstekens voorkomen dat een opdracht wordt uitgevoerd of een variabele wordt uitgebreid. Het hele argument wordt behandeld als platte tekst.

Kijk naar het onderstaande voorbeeld. Als ik het argument omsluit met enkele aanhalingstekens, wordt de variabele OS niet geïnterpreteerd en behandeld als tekst.

dany@pindabook:~$ echo 'Ik gebruik ${OS}'
Ik gebruik ${OS}
dany@pindabook:~$ echo "Ik gebruik ${OS}"
Ik gebruik Debian 12 Bookworm

Uitvoer omleiden en doorsturen

Zoals eerder vermeld, print de echo opdracht standaard de uitvoer naar de standaard uitvoer (terminal). Wanneer je shell scripts schrijft, kun je in een situatie terechtkomen waarin je de uitvoer van de echo opdracht in een bestand wilt opslaan. Je kunt dit doen met de bash redirection operator.

dany@pindabook:~$ echo "Welkom bij PindaNet" > /tmp/op.log
dany@pindabook:~$ cat /tmp/op.log 
Welkom bij PindaNet

Je kunt de uitvoer van de echo opdracht ook naar de pipe sturen voor verdere verwerking.

dany@pindabook:~$ echo "Ik gebruik ${OS}"
Ik gebruik Debian 12 Bookworm
dany@pindabook:~$ echo "Ik gebruik ${OS}" | grep -i -o Debian
Debian

Meerregelige tekst

Je argument kan soms meer dan één regel beslaan. Je kunt het argument voor meerdere regels omsluiten met dubbele aanhalingstekens om de uitvoer af te drukken rekening houdend met nieuwe regels, tabs en spaties.

dany@pindabook:~$ echo "Dit is de eerste regel
> Dit is de tweede regel
> En dit de derde"
Dit is de eerste regel
Dit is de tweede regel
En dit de derde

In sommige gevallen wil je het argument afdrukken als een enkele regel, ook al wordt het doorgegeven als een meerregelige string. Gebruik in zulke gevallen het "\" symbool aan het einde van elke regel, zodat de volgende regel doorloopt op de vorige regel.

dany@pindabook:~$ echo "Ik voer \
> de echo opdracht \
> nogmaals uit"
Ik voer de echo opdracht nogmaals uit

Dit is niet alleen specifiek voor de echo opdracht. Je kunt deze aanpak gebruiken om hele lange opdrachten uit te schrijven naar multiline voor betere leesbaarheid.

Backslash interpretatie

De echo opdracht accepteert veel backslash interpretatie (escape) karakters als argumenten. Om deze speciale karakters te laten herkennen door de echo opdracht, moet de -e optie worden doorgegeven. Je kunt de lijst van ondersteunde speciale karakters vinden in de man pagina van de echo opdracht.

       echo [-neE] [arg ...]
              Output the args, separated by spaces, followed by a newline.  The return status is 0 unless a write error occurs.  If
              -n is specified, the trailing newline is suppressed.  If the -e option is  given,  interpretation  of  the  following
              backslash-escaped  characters is enabled.  The -E option disables the interpretation of these escape characters, even
              on systems where they are interpreted by default.  The xpg_echo shell option may be  used  to  dynamically  determine
              whether  or  not  echo expands these escape characters by default.  echo does not interpret -- to mean the end of op‐
              tions.  echo interprets the following escape sequences:
\a alert (bell) \b backspace \c suppress further output \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Je zult niet alle speciale tekens in je dagelijkse leven gebruiken. Je zult vooral newline-tekens, tabs en backslash escape-tekens gebruiken.

Nieuwe regel - \n

Een nieuwe regel wordt toegevoegd wanneer je \n doorgeeft aan de echo opdracht. Je kunt meerdere \n invoeren, zodat er meer regels worden toegevoegd.

dany@pindabook:~$ echo -e "Dit is de eerste regel\nDit is de tweede regel\nEn dit de derde"
Dit is de eerste regel
Dit is de tweede regel
En dit de derde
Horizontal tab - \t

Wanneer \t wordt gebruikt, worden tabspaties toegevoegd. Je kunt meerdere escape-tekens combineren, zoals ik hieronder heb gedaan.

dany@pindabook:~$ echo -e "Voer de gebruikersnaam in\t:\n"
Voer de gebruikersnaam in       :
Vertical tab - \v

Om vertikale tabs te plaatsen, gebruik je \v.

dany@pindabook:~$ echo -e "Voer de gebruikersnaam in:\vVoer het wachtwoord in:"
Voer de gebruikersnaam in:
                          Voer het wachtwoord in:
Uitvoer onderdrukken - \c

Wanneer \c wordt gebruikt, wordt alles wat na \c komt onderdrukt.

dany@pindabook:~$ echo -e "Ik gebruik \cKDE"
Ik gebruik dany@pindabook:~$
Terugloop - \r

Wanneer \r wordt gebruikt, wordt de cursor teruggezet naar het eerste teken en wordt alles wat na \r komt afgedrukt ter vervanging van bestaande tekens.

dany@pindabook:~$ echo -e "Ik gebruik Debian 12 Bookworm\rEn jij?"
En jij?uik Debian 12 Bookworm

Backslash interpretatie uitschakelen

Het standaard gedrag van de echo opdracht is dat het speciale karakters zal behandelen als platte tekst, tenzij de -e vlag wordt doorgegeven.

Laten we een echo opdracht uitvoeren zonder opties:

dany@pindabook:~$ echo "Welkom bij PindaNet \nLinux tips"
Welkom bij PindaNet \nLinux tips

De echo opdracht behandelt het speciale teken \n als een gewone tekenreeks. Laten we nu dezelfde opdracht opnieuw uitvoeren, maar deze keer met de -e vlag.

dany@pindabook:~$ echo -e "Welkom bij PindaNet \nLinux tips"
Welkom bij PindaNet 
Linux tips

Heb je het verschil gezien? De echo opdracht behandelt het \n karakter niet als platte tekst en het toont alles wat na het \n speciale karakter komt op een nieuwe regel.

Daarom, als je speciale karakters wilt gebruiken zoals \n, \t, \v, enz., moet je de -e optie gebruiken. Anders zal echo alles behandelen als een gewone string.

Sta me toe om je een ander voorbeeld te laten zien.

dany@pindabook:~$ echo -e "Dag allemaal\nDag iedereen\nAllen welkom"
Dag allemaal
Dag iedereen
Allen welkom

Zoals je in de bovenstaande uitvoer ziet, geeft de echo opdracht drie regels weer, één voor één (d.w.z. telkens in een nieuwe regel).

Wat als je alleen een specifiek speciaal karakter wilt escapen? Dit is waar de dubbele backslash (\\) te hulp schiet.

Ik wil bijvoorbeeld een \ karakter weergeven. Om dat te doen, zet ik een dubbele backslash (\\), zoals hieronder:

dany@pindabook:~$ echo -e "Dag allemaal\\iedereen\nAllen welkom"
Dag allemaal\iedereen
Allen welkom

Nu behandelt echo het eerste speciale teken als een gewone tekenreeks.

Daarom, als je veel speciale tekens hebt en je wilt alleen een backslash, moet je de dubbele backslash (\\) gebruiken.

Echo