BashErste Schritte mit Bash

Versionen

Ausführung Veröffentlichungsdatum
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 Welt mit Variablen

Erstellen Sie eine neue Datei namens hello.sh mit dem folgenden Inhalt und erteilen Sie ihr ausführbare Berechtigungen mit chmod +x hello.sh .

Ausführen / Ausführen über: ./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

Bei der Ausführung wird Hello, World als Standardausgabe ausgegeben.

Um bash zu sagen, wo sich das Skript befindet, müssen Sie sehr spezifisch sein, indem Sie es auf das übergeordnete Verzeichnis zeigen, normalerweise mit ./ wenn es sich um Ihr Arbeitsverzeichnis handelt . ist ein Alias ​​für das aktuelle Verzeichnis. Wenn Sie das Verzeichnis nicht angeben, versucht bash , das Skript in einem der Verzeichnisse zu finden, die in der Umgebungsvariablen $PATH sind.


Der folgende Code akzeptiert ein Argument $1 , das das erste Befehlszeilenargument ist, und gibt es in einer formatierten Zeichenfolge nach Hello, .

Ausführen / Ausführen über: ./hello.sh World

#!/usr/bin/env bash
printf "Hello, %s\n" "$1"
#> Hello, World

Es ist wichtig zu wissen, dass $1 in Anführungszeichen und nicht in Anführungszeichen gesetzt werden muss. "$1" nach Wunsch zum ersten Befehlszeilenargument erweitert, während '$1' zu der Literalzeichenfolge $1 ausgewertet wird.

Sicherheitshinweis:
Lesen Sie die Sicherheitsaspekte des Vergessens, eine Variable in Bash-Shells zu zitieren, um zu verstehen, wie wichtig es ist, den variablen Text in Anführungszeichen zu setzen.

Hallo Welt

Interaktive Shell

Die Bash-Shell wird häufig interaktiv verwendet: Sie können Befehle eingeben und bearbeiten und dann ausführen, wenn Sie die Eingabetaste drücken. Viele Unix-basierte und Unix-ähnliche Betriebssysteme verwenden Bash als Standardshell (insbesondere Linux und macOS). Das Terminal startet beim Start automatisch einen interaktiven Bash-Shell-Prozess.

Geben Sie Hello World indem Sie Folgendes eingeben:

echo "Hello World"
#> Hello World  # Output Example

Anmerkungen

  • Sie können die Shell ändern, indem Sie einfach den Namen der Shell in terminal eingeben. Zum Beispiel: sh , bash usw.

  • echo ist ein in Bash eingebauter Befehl, der die empfangenen Argumente in die Standardausgabe schreibt. Standardmäßig wird eine neue Zeile an die Ausgabe angehängt.


Nicht interaktive Shell

Die Bash-Shell kann auch nicht interaktiv von einem Skript aus ausgeführt werden, sodass die Shell keine menschliche Interaktion erfordert. Interaktives Verhalten und Skriptverhalten sollten identisch sein - eine wichtige Überlegung beim Design der Unix V7-Bourne-Shell und des transitiven Bash. Daher kann alles, was in der Befehlszeile ausgeführt werden kann, zur Wiederverwendung in eine Skriptdatei eingefügt werden.

Führen Sie die folgenden Schritte aus, um ein Hello World Skript zu erstellen:

  1. Erstellen Sie eine neue Datei namens hello-world.sh

    touch hello-world.sh
    
  2. Machen Sie das Skript ausführbar, indem Sie chmod +x hello-world.sh

  3. Fügen Sie diesen Code hinzu:

    #!/bin/bash
    echo "Hello World"
    

    Zeile 1 : Die erste Zeile des Skripts muss mit der Zeichenfolge #! , genannt Shebang 1 . Der shebang weist das Betriebssystem an, /bin/bash , die Bash-Shell, auszuführen und übergibt den Pfad des Skripts als Argument.

    ZB /bin/bash hello-world.sh

    Zeile 2 : Verwendet den Befehl echo , um Hello World in die Standardausgabe zu schreiben.

  1. hello-world.sh Skript hello-world.sh von der Befehlszeile aus mit einer der folgenden hello-world.sh aus:

    • ./hello-world.sh - am häufigsten verwendet und empfohlen
    • /bin/bash hello-world.sh
    • bash hello-world.sh - vorausgesetzt, dass /bin in Ihrem $PATH
    • sh hello-world.sh

Für den realen Produktionsbetrieb würden Sie die Erweiterung .sh weglassen (was ohnehin irreführend ist, da dies ein Bash-Skript und kein sh Skript ist) und die Datei möglicherweise in ein Verzeichnis innerhalb Ihres PATH sodass Sie unabhängig davon verfügbar sind Ihr aktuelles Arbeitsverzeichnis, genau wie ein Systembefehl wie cat oder ls .

Häufige Fehler sind:

  1. chmod +x hello-world.sh vergessen, die Ausführungsberechtigung für die Datei anzuwenden, z. B. chmod +x hello-world.sh , führt dies zur Ausgabe von ./hello-world.sh: Permission denied .

  2. Bearbeiten des Skripts unter Windows, wodurch falsche Zeilenendezeichen erzeugt werden, die Bash nicht verarbeiten kann.

    Ein häufiges Symptom ist : command not found wenn der Wagenrücklauf den Cursor an den Zeilenanfang gezwungen hat und den Text vor dem Doppelpunkt in der Fehlernachricht überschreibt.

    Das Skript kann mit dem Programm dos2unix werden.

    Ein Beispiel dafür: dos2unix hello-world.sh

    dos2unix bearbeitet die Datei inline.

  3. Wenn Sie sh ./hello-world.sh , sh ./hello-world.sh nicht, dass bash und sh unterschiedliche Shells mit unterschiedlichen Features sind (obwohl Bash rückwärtskompatibel ist, ist der gegenteilige Fehler harmlos).

    Es ist auf jeden Fall vorzuziehen, sich einfach auf die Shebang-Linie des Skripts zu verlassen, als explizit bash oder sh (oder python oder perl oder awk oder ruby oder ...) vor dem Dateinamen jedes Skripts zu schreiben.

    Eine gebräuchliche Shebang-Zeile, mit der Sie Ihr Skript portabler machen können, ist die Verwendung von #!/usr/bin/env bash anstatt einen Pfad zu Bash fest zu codieren. Auf diese Weise muss /usr/bin/env existieren, aber danach muss bash nur auf Ihrem PATH . Auf vielen Systemen ist /bin/bash nicht vorhanden, und Sie sollten /usr/local/bin/bash oder einen anderen absoluten Pfad verwenden. Diese Änderung vermeidet, die Details davon herausfinden zu müssen.


1 Wird auch als sha-bang, hashbang, pound-bang, hash pling bezeichnet.

Anzeigen von Informationen zu den integrierten Bash-Inhalten

help <command>

Dadurch wird die Bash-Hilfeseite (Handbuch) für das angegebene integrierte Gerät angezeigt.

Zum Beispiel zeigt die help unset :

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.

Um eine Liste aller eingebauten Ins mit einer kurzen Beschreibung anzuzeigen, verwenden Sie

help -d

Hallo Welt mit Benutzereingabe

Das Folgende fordert einen Benutzer zur Eingabe auf und speichert diese Eingabe dann als Zeichenfolge (Text) in einer Variablen. Die Variable wird dann verwendet, um dem Benutzer eine Nachricht zu geben.

#!/usr/bin/env bash
echo  "Who are you?"
read name
echo "Hello, $name."

Der Befehl read hier liest eine Zeile von Daten von der Standardeingabe in den variablen name . Diese wird dann mit $name referenziert und mit echo Standard echo .

Beispielausgabe:

$ ./hello_world.sh
Who are you?
Matt
Hello, Matt.

Hier hat der Benutzer den Namen "Matt" eingegeben und dieser Code wurde verwendet, um Hello, Matt. zu sagen Hello, Matt. .

Wenn Sie während des Druckvorgangs etwas an den Variablenwert anhängen möchten, verwenden Sie den Variablennamen in geschweiften Klammern (siehe folgendes Beispiel):

#!/usr/bin/env bash
echo  "What are you doing?"
read action
echo "You are ${action}ing."

Beispielausgabe:

$ ./hello_world.sh
What are you doing?
Sleep
You are Sleeping.

Wenn der Benutzer hier eine Aktion eingibt, wird während des Druckens "ing" an diese Aktion angehängt.

Benannte Argumente behandeln

#!/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 Welt im "Debug" -Modus

$ cat hello.sh 
#!/bin/bash 
echo "Hello World"
$ bash -x hello.sh 
+ echo Hello World
Hello World

Mit dem Argument -x können Sie jede Zeile des Skripts durchgehen. Ein gutes Beispiel ist 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

Der oben angezeigte Fehler reicht nicht aus, um das Skript zu verfolgen. Wenn Sie jedoch die folgende Methode verwenden, können Sie besser nachvollziehen, wo Sie den Fehler im Skript suchen.

$ bash -x hello.sh 
+ echo Hello World\n
Hello World

+ adding_string_to_number=s
+ expr 5 + s
expr: non-integer argument
+ v=

Bedeutung des Zitierens in Strings

Quoting ist wichtig für die String-Erweiterung in Bash. Mit diesen können Sie steuern, wie die Bash Ihre Strings analysiert und erweitert.

Es gibt zwei Arten von Zitaten:

  • Schwach : verwendet doppelte Anführungszeichen: "
  • Stark : verwendet einfache Anführungszeichen: '

Wenn Sie Ihr Argument erweitern wollen, können Sie Weak Quoting verwenden :

#!/usr/bin/env bash
world="World"
echo "Hello $world"
#> Hello World

Wenn Sie Ihr Argument nicht erweitern wollen, können Sie Strong Quoting verwenden :

#!/usr/bin/env bash
world="World"
echo 'Hello $world'
#> Hello $world

Sie können auch Escape verwenden, um die Erweiterung zu verhindern:

#!/usr/bin/env bash
world="World"
echo "Hello \$world"
#> Hello $world

Für detailliertere Informationen außer Anfängerdetails können Sie hier fortfahren.