BashAan de slag met Bash


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

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

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:

  1. Maak een nieuw bestand met de naam hello-world.sh

    touch hello-world.sh
     
  2. Maak het script uitvoerbaar door chmod +x hello-world.sh

  3. 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 om Hello World naar de standaarduitvoer te schrijven.

  1. Voer het hello-world.sh script uit vanaf de opdrachtregel op een van de volgende hello-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:

  1. 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 .

  2. 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.

  3. Met behulp van sh ./hello-world.sh , niet beseffend dat bash en sh 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 of sh (of python of perl of awk of ruby 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 moet bash gewoon op je PATH . 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.

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=
 

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 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.

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.

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