Skip to Content
2021Bash

Bash CheatSheet (M122)

Datum: September 2021
Lesedauer: 7 Minuten


Hilfe

<command> --help
man <command>

Scipts

Testen ob der Name noch frei ist

which scriptName

Zeile 1 bestimmen

echo $SHELL

Script erstellen (erste Zeile von vorheriger Ausgabe übernehmen)

#!/bin/bash

Ausführung

./scriptName.sh

Scriptausführung erkennen/stoppen

Prozesse anzeigen

ps -lf

Alternativ

top

Prozess beenden

kill <PID>

Kommentare

# Kommentar

Shell Variablen

Variable(n)Bedeutung
$0Name des Shellskriptes
$$Prozessnummer des Shellskriptes
$?Beendigungsstatus eines Shellskriptes; kann mit exit gesetzt werden;
$!Prozessnummer des zuletzt gestarteten Hintergrundprozesses (mit & gestartet)
$1 bis $nArgumente aus der Kommandozeile
$\*Alle Argumente aus der Kommandozeile in einer Zeichenkette
$@Alle Argumente aus der Kommandozeile als einzelne Zeichenketten (Array von Zeichenketten)
$#Anzahl aller Argumente in der Kommandozeile
$\_Letztes Argument in der Kommandozeile des zuletzt aufgerufenen Kommandos

Zuweisung im Skript

a="Hello World" counter=0 echo $a

Rechnen

y=40 echo $[y - 1]

Echo mit Variablen

echo -e "Hallo, mein Name ist: $(whoami) \n" echo -e "Mein Computer heisst: $HOSTNAME \n" echo -e "Ich benutze die Bash Version: $BASH_VERSION \n" echo -e "Ich arbeite momentan im Verzeichnis: $PWD \n" echo -e "Ich war zuletzt im Verzeichnis: $OLDPWD \n" echo -e "Eigentlich ist mein Heimverzeichnis: $HOME \n" echo "Name des Skriptes (Parameter 0): $0" echo "1. Parameter: $1" echo "Der Dateiname ist: " $(basename $1) echo "Der Pfad heisst: " $(dirname $1)

Einlesen

read answer echo $answer

if

if [ $1 -eq "hello" ] # see Comparer below then echo "welt" else echo "hh" fi

switch

echo -n "Enter the name of a country: " read COUNTRY case $COUNTRY in "Switzerland") # string echo -n "Schweiz" ;; [0-9]) # using regex echo -n "any Number" ;; *) echo -n "unknown" ;; esac

while

exit=0 while [ $exit -ne 1 ] do i=0 while [ $i -lt 10 ] do echo "." sleep 1 ((i++)) done $exit=1 done

for

for i in {0..3} # for item in [LIST] do echo "Number: $i" done # declaring array: BOOKS=("In Search of Lost Time" "Don Quixote" "Ulysses" "The Great Gatsby") for book in "${BOOKS[@]}"; do echo "Book: $book" done # using i: for ((i = 0 ; i <= 1000 ; i++)); do echo "Counter: $i" done # using files: for file in /home/vmadmin/Desktop/M122; do echo $file done

function

function hello_world { echo "hello world" } globalVar="change me" hello_user () { # param: $1 - firstname # param: $2 - lastname local localVar=10 globalVar="changed" echo "hello $1 $2" return 0 # only numeric - else use global vars } # call function -> without `()` hello_world hello_user "john" "doe" # access return value echo $?

Operationen

ComparerExplanation
! <EXPRESSION>The EXPRESSION is false.
-n <STRING>The length of STRING is greater than zero.
-z <STRING>The lengh of STRING is zero (ie it is empty).
<STRING1> = <STRING2>STRING1 is equal to STRING2
<STRING1> != <STRING2>STRING1 is not equal to STRING2
<INTEGER1> -eq <INTEGER2>INTEGER1 is numerically equal to INTEGER2
<INTEGER1> -gt <INTEGER2>INTEGER1 is numerically greater than INTEGER2
<INTEGER1> -lt <INTEGER2>INTEGER1 is numerically less than INTEGER2
-d <FILE>FILE exists and is a directory.
-e <FILE>FILE exists.
-r <FILE>FILE exists and the read permission is granted.
-s <FILE>FILE exists and it’s size is greater than zero (ie. it is not empty).
-w <FILE>FILE exists and the write permission is granted.
-x <FILE>FILE exists and the execute permission is granted.

Regex

grep "<regex expression>" <file>

Operationen

ZeichenFunktion
^Anfang der Zeile
$Ende der Zeile
^$komplette Zeile
.beliebiges Zeichen
*beliebig oft
.*beliebig viele
[]ein Zeichen aus dem Bereich

Ausführen

bash name ./name

Befehlsübersicht

who

Angemeldete Benutzer

whoami

Eigener Benutzername

ls

Dateien auflisten

ls -la

chmod

Berechtigungen ändern

chmod 760 datei.txt

Übersicht

OctalDecimalPermissionRepresentation
0000No Permission---
0011Execute—x
0102Write-w-
0113Write + Execute-wx
1004Readr—
1015Read + Executer-x
1106Read + Writerw-
1117Read + Write + Executerwx
UserGroupOthers
rwxrwx—x

cp

Datei(en) kopieren

cp text.txt textCopy.txt

mv

Datei(en) umbenennen oder verschieben

cp oldName.txt newName.txt

rm

Datei(en) löschen

rm bad.txt

ping

ping -c 1

touch

Leere Datei erzeugen

touch newFile.txt

find

Dateien und Verzeichnisse suchen

find /Downloads -user root -name "*datei*"

* -> beliebige Anzahl zeichen
? -> ein einziges beliebiges Zeichen
[] -> eingegrenzte Zeichen (find /Desktop -name designVersion[1-2].txt)

cat

Inhalt einer Datei ausgeben

cat .bash_logout

Zeigt die ersten Zeilen einer Datei an

head -n 4 .bash_logout

tail

Zeigt die letzten Zeilen einer Datei an

tail -n 3 .bash_logout

nano

Dateien editieren Speichern:

<CTRL>+O

nautilus

Dateimanager starten Nautilus öffnen

sudo nautilus

Achtung:
Wenn Sie im grafischen Dateimanager nautilus als root neue Ordner und Dateien anlegen, wird root der neue Besitzer (und nicht vmadmin). Dies können Sie mit chown und chgrp wieder korrigieren:

sudo chown vmadmin newFile.txt sudo chgrp vmadmin newFile.txt

wc

Zeilen, Worte und Zeichen in einer Datei zählen

wc long.txt

Output:

Zeilen (-l)Wörter (-w)Zeichen (-c)
735220

grep

Dateiinhalt durchsuchen Ist der Benutzer eingetragen

grep -e vmadmin /etc/passwd

In wievielen Zeilen kommt vm vor?

grep -c vm /etc/passwd

sort

Dateiinhalt sortieren

sort -t ":" -k 2 flowers.txt

cut

Dateiinhalt herausschneiden

cut -d " " -f 1,3 flowers.txt

tr

Dateiinhalt umwandeln

tr [:lower:] [:upper:] < flowers.txt tr -s [:blank:] "\t" < flowers.txt

pwd

Aktuelles Verzeichnis

mkdir

Ordner erstellen

rmdir

Ein leeres Verzeichnis löschen

rm -r

Ein Verzeichnis löschen

diff

2 Dateien vergleichen

du

Zeigt verwendeten Festplatten-Platz an

ps

Zeigt Prozesse an

ps -Alf

(Zeigt die Prozesse an, sortiert nach Prozessidentifikationsnummer (PID))

Umleitung

Ausgabeumlenkung

Ergebnis in Datei schreiben

ls > folderContent.txt

Ergebnis an Datei anhängen

ls >> folderContent.txt

Nur Treffer anzeigen

find / -name "*usb*.conf" 2>/dev/null

Nur Fehler anzeigen

find / -name "*usb*.conf" 1>found.txt

Vollständige Ausgabe in der Datei und keine Ausgabe auf dem Bildschirm

find / -name "*usb*.conf" &>found+error.txt

Eingabeumlenkung

Als Eingabedaten können Sie einem Befehl mit < Daten aus einer Datei schicken, anstelle sie auf der Tastatur (Standard-Eingabe) einzugeben.

dc < datei.txt

|

Datenweitergabe OHNE Pipe

cut -d " " -f2,4 flowers.txt > tmp.txt sort -n -k2 tmp.txt

Datenweitergabe mit Pipe

cut -d " " -f2,4 flowers.txt | sort -n -k2

()

Kommandosubstitution mit Klammern

ls -l $(find /sys/class/sound -name "*seq*")

tee

Ausgabe duplizieren

cut -d " " -f 1,3 blumenartikel.txt | tee outputblumen.txt

Hilfreiche Funktionen

function is_num { # string - string to test REGEX="^[0-9]+$" if [[$1 =~ $REGEX]]; then true else false fi } function is_decimal { # string - string to test REGEX="^[0-9]+(\.[0-9]+$|$)" if [[$1 =~ $REGEX]]; then true else false fi } function is*str { # string - string to test REGEX="[A-Za-z0-9*]+" if [[$1 =~ $REGEX]]; then true else false fi } function file_exists { # file if [[-f "$1" && -n "$1"]]; then true else false fi } function folder_exists { # folder if [[-d "$1" && -n "$1"]]; then true else false fi } function files_are_equal { # file - file 1 # file - file 2 diff $1 $2 &>/dev/null return $? } function file_contains { # file # expression - regex expression grep -e $2 $1 &>/dev/null return $? } function folder_empty { # folder - foldername if [[-z "$(ls $1 2>/dev/null)"]]; then true else false fi } function folder_contains { # folder # expression - or filename find $1 -printf "%f\n" | grep -e $2 &>/dev/null return $? } function kill_process { # string - process name kill $(ps -Alf | grep "$1" | tr -s [:blank:] "\t" | head -n1 | cut -f4) &>/dev/null return $? } function get_file_line { # file # line - line number sed "$2q;d" $1 } USER_INPUT="" function get_input { # string - prompt to show echo -n "$1: " read USER_INPUT=$REPLY } function read_confirmation { read -p "Do you want to continue? [Y/n] " -n 1 -r REGEX="^[Yy]$" if [[$REPLY =~ $REGEX]]; then true else false fi } function set_var { # string - var name # string - var value printf -v "$1" "%s" "$2" } function get_filename { # string - full file path basename $1 } function validate_param { # string - var name # string - var value if [[$1 =~ _dir$]]; then folder_exists $2 return $? elif [[ $1 =~ _file$ ]]; then file_exists $2 return $? elif [[ $1 =~ _num$ || $1 =~ _int$ ]]; then is_num $2 return $? elif [[ $1 =~ _decimal$ || $1 =~ _dec$ ]]; then is_dec $2 return $? elif [[ $1 =~ _string$ || $1 =~ _str$ ]]; then is_str $2 return $? fi } function validate_params { for i in ${!PARAMS[@]}; do param=${PARAMS[$i]} value=${!param} if ! $(validate_param $param $value); then print_usage script_error fi done } function script_error { exit 1 } function script_success { exit 0 } function print_usage { echo "usage: $0 ${PARAMS[*]}" # string / num / decimal / dir / file }