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).
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
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 +\['
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).
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:~$
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.
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
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
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
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.
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.
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
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 :
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:
Wanneer \c
wordt gebruikt, wordt alles wat na \c komt onderdrukt.
dany@pindabook:~$ echo -e "Ik gebruik \cKDE"
Ik gebruik dany@pindabook:~$
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
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.