Bash Zelfstudie
Aan de slag met Bash
Zoeken…
versies
Versie | Publicatiedatum |
---|---|
0.99 | 1989/06/08 |
1.01 | 1989/06/23 |
2.0 | 1996/12/31 |
2.02 | 1998/04/20 |
2.03 | 1999/02/19 |
2.04 | 2001/03/21 |
2.05b | 2002/07/17 |
3.0 | 2004-08-03 |
3.1 | 2005-12-08 |
3.2 | 2006-10-11 |
4.0 | 2009-02-20 |
4.1 | 2009-12-31 |
4.2 | 2011-02-13 |
4.3 | 2014/02/26 |
4.4 | 2016/09/15 |
Hallo wereld met behulp van variabelen
Maak een nieuw bestand met de naam hello.sh
met de volgende inhoud en geef het uitvoerbare machtigingen met chmod +x hello.sh
.
Uitvoeren / uitvoeren via:
./hello.sh
#!/usr/bin/env bash
# Note that spaces cannot be used around the `=` assignment operator
whom_variable="World"
# Use printf to safely output the data
printf "Hello, %s\n" "$whom_variable"
#> Hello, World
Hiermee wordt Hello, World
naar standaarduitvoer afgedrukt wanneer deze wordt uitgevoerd.
Om bash te vertellen waar het script is, moet je heel specifiek zijn, door het naar de map te verwijzen, normaal gesproken met ./
als het je werkmap is, waar .
is een alias voor de huidige map. Als u de map niet opgeeft, probeert bash
het script te vinden in een van de mappen in de omgevingsvariabele $PATH
.
De volgende code accepteert een argument $1
, dat het eerste opdrachtregelargument is, en voert het uit in een opgemaakte string, volgend op Hello,
Uitvoeren / uitvoeren via:
./hello.sh World
#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World
Het is belangrijk op te merken dat $1
moet worden geciteerd in dubbele aanhalingstekens, niet in enkele aanhalingstekens. "$1"
desgewenst uitgebreid naar het eerste opdrachtregelargument, terwijl '$1'
resulteert in een letterlijke tekenreeks $1
.
Beveiligingsnota:
Lees de beveiligingsimplicaties van het vergeten om een variabele in bash-shells te citeren om het belang te begrijpen van het plaatsen van de variabele tekst tussen dubbele aanhalingstekens.
Hallo Wereld
Interactieve Shell
De Bash-shell wordt vaak interactief gebruikt : hiermee kunt u opdrachten invoeren en bewerken en vervolgens uitvoeren wanneer u op de Return- toets drukt. Veel op Unix gebaseerde en Unix-achtige besturingssystemen gebruiken Bash als hun standaardshell (met name Linux en macOS). De terminal start automatisch een interactief Bash shell-proces bij het opstarten.
Voer Hello World
door het volgende te typen:
echo "Hello World"
#> Hello World # Output Example
Notes
U kunt de shell wijzigen door de naam van de shell in de terminal te typen. Bijvoorbeeld:
sh
,bash
, etc.echo
is een Bash ingebouwd commando dat de argumenten die het ontvangt naar de standaarduitvoer schrijft. Het voegt standaard een nieuwe regel toe aan de uitvoer.
Niet-interactieve shell
De Bash-shell kan ook niet-interactief worden uitgevoerd vanuit een script, waardoor de shell geen menselijke interactie vereist. Interactief gedrag en scriptgedrag moeten identiek zijn - een belangrijke ontwerpoverweging van de Unix V7 Bourne-shell en transitively Bash. Daarom kan alles wat op de opdrachtregel kan worden gedaan, in een scriptbestand worden geplaatst voor hergebruik.
Volg deze stappen om een Hello World
script te maken:
Maak een nieuw bestand met de naam
hello-world.sh
touch hello-world.sh
Maak het script uitvoerbaar door
chmod
+x hello-world.sh
Voeg deze code toe:
#!/bin/bash echo "Hello World"
Regel 1 : De eerste regel van het script moet beginnen met de tekenreeks
#!
, aangeduid als shebang 1 . De shebang instrueert het besturingssysteem om/bin/bash
, de Bash-shell, uit te voeren en het pad van het script als argument door te geven.Bijvoorbeeld
/bin/bash hello-world.sh
Regel 2 : gebruikt de
echo
opdracht omHello World
naar de standaarduitvoer te schrijven.
Voer het
hello-world.sh
script uit vanaf de opdrachtregel op een van de volgendehello-world.sh
:-
./hello-world.sh
- het meest gebruikt en aanbevolen -
/bin/bash hello-world.sh
-
bash hello-world.sh
- ervan uitgaande dat/bin
in je$PATH
-
sh hello-world.sh
-
Voor echt productiegebruik zou je de .sh
extensie weglaten (die toch misleidend is, omdat dit een Bash-script is, geen sh
script) en het bestand misschien naar een map in je PATH
verplaatsen zodat het voor jou beschikbaar is ongeacht uw huidige werkmap, net als een systeemopdracht zoals cat
of ls
.
Veelgemaakte fouten zijn onder meer:
Vergeten om uitvoerende machtiging toe te passen op het bestand, dat wil zeggen
chmod +x hello-world.sh
, resulterend in de uitvoer van./hello-world.sh: Permission denied
.Het script op Windows bewerken, dat onjuiste tekens met een regeluiteinde produceert die Bash niet aan kan.
Een veel voorkomend symptoom is
: command not found
waarbij de regelterugloop de cursor naar het begin van de regel heeft gedwongen, waarbij de tekst vóór de dubbele punt in het foutbericht wordt overschreven.Het script kan worden gecorrigeerd met het programma
dos2unix
.Een voorbeeldgebruik:
dos2unix hello-world.sh
dos2unix
bewerkt het bestand inline.Met behulp van
sh ./hello-world.sh
, niet beseffend datbash
ensh
verschillende shells zijn met verschillende functies (hoewel, aangezien Bash achterwaarts compatibel is, de tegenovergestelde fout onschadelijk is).Hoe dan ook, simpelweg vertrouwen op de shebang-regel van het script heeft enorm de voorkeur boven het expliciet schrijven van
bash
ofsh
(ofpython
ofperl
ofawk
ofruby
of ...) voor de bestandsnaam van elk script.Een veelgebruikte shebang-regel om je script draagbaarder te maken, is
#!/usr/bin/env bash
plaats van een pad naar Bash hard te coderen. Op die manier moet/usr/bin/env
bestaan, maar daarna moetbash
gewoon op jePATH
. Op veel systemen bestaat/bin/bash
niet en moet je/usr/local/bin/bash
of een ander absoluut pad gebruiken; deze wijziging voorkomt dat je daar de details van moet achterhalen.
1 Ook wel sha-bang, hashbang, pond-bang, hash-pling genoemd.
Informatie weergeven voor ingebouwde Bash
help <command>
Hiermee wordt de Bash-help (handmatig) pagina weergegeven voor de opgegeven ingebouwde.
help unset
toont bijvoorbeeld:
unset: unset [-f] [-v] [-n] [name ...] Unset values and attributes of shell variables and functions. For each NAME, remove the corresponding variable or function. Options: -f treat each NAME as a shell function -v treat each NAME as a shell variable -n treat each NAME as a name reference and unset the variable itself rather than the variable it references Without options, unset first tries to unset a variable, and if that fails, tries to unset a function. Some variables cannot be unset; also see `readonly'. Exit Status: Returns success unless an invalid option is given or a NAME is read-only.
Gebruik om een lijst met alle ingebouwde ins met een korte beschrijving te bekijken
help -d
Hallo wereld met gebruikersinvoer
Het volgende vraagt een gebruiker om invoer en slaat die invoer vervolgens op als een tekenreeks (tekst) in een variabele. De variabele wordt vervolgens gebruikt om een bericht aan de gebruiker te geven.
#!/usr/bin/env bash
echo "Who are you?"
read name
echo "Hello, $name."
Het commando read
hier leest een regel van de gegevens van de standaard invoer in de variabele name
. Hiernaar wordt vervolgens verwezen met $name
en standaard afgedrukt met echo
.
Voorbeelduitgang:
$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.
Hier heeft de gebruiker de naam "Matt" ingevoerd en deze code werd gebruikt om Hello, Matt.
te zeggen Hello, Matt.
.
En als u iets aan de variabele waarde wilt toevoegen tijdens het afdrukken, gebruikt u accolades rond de naam van de variabele, zoals in het volgende voorbeeld:
#!/usr/bin/env bash
echo "What are you doing?"
read action
echo "You are ${action}ing."
Voorbeelduitgang:
$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.
Hier wanneer de gebruiker een actie invoert, wordt "ing" aan die actie toegevoegd tijdens het afdrukken.
Genoemde argumenten verwerken
#!/bin/bash
deploy=false
uglify=false
while (( $# > 1 )); do case $1 in
--deploy) deploy="$2";;
--uglify) uglify="$2";;
*) break;
esac; shift 2
done
$deploy && echo "will deploy... deploy = $deploy"
$uglify && echo "will uglify... uglify = $uglify"
# how to run
# chmod +x script.sh
# ./script.sh --deploy true --uglify false
Hallo wereld in de modus "Debug"
$ cat hello.sh
#!/bin/bash
echo "Hello World"
$ bash -x hello.sh
+ echo Hello World
Hello World
Met het argument -x
kunt u elke regel in het script doorlopen. Een goed voorbeeld is hier:
$ cat hello.sh
#!/bin/bash
echo "Hello World\n"
adding_string_to_number="s"
v=$(expr 5 + $adding_string_to_number)
$ ./hello.sh
Hello World
expr: non-integer argument
De bovenstaande foutmelding is niet voldoende om het script te traceren; Het gebruik van de volgende manier geeft u echter een beter idee waar u naar de fout in het script moet zoeken.
$ bash -x hello.sh
+ echo Hello World\n
Hello World
+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=
Het belang van citaten in strings
Citeren is belangrijk voor stringuitbreiding in bash. Hiermee kun je bepalen hoe de bash je strings parseert en uitbreidt.
Er zijn twee soorten citaten:
- Zwak : gebruikt dubbele aanhalingstekens: "
- Sterk : gebruikt enkele aanhalingstekens: '
Als je wilt bashen om je argument uit te breiden, kun je Zwak Citeren gebruiken :
#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World
Als je niet wilt bashen om je argument uit te breiden, kun je Strong Quoting gebruiken :
#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world
Je kunt ook escape gebruiken om uitbreiding te voorkomen:
#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world
Voor meer gedetailleerde informatie, behalve voor beginners, kunt u deze hier blijven lezen.