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 |
---|---|
$0 | Name des Shellskriptes |
$$ | Prozessnummer des Shellskriptes |
$? | Beendigungsstatus eines Shellskriptes; kann mit exit gesetzt werden; |
$! | Prozessnummer des zuletzt gestarteten Hintergrundprozesses (mit & gestartet) |
$1 bis $n | Argumente 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
Comparer | Explanation |
---|---|
! | The EXPRESSION is false. |
-n | The length of STRING is greater than zero. |
-z | The lengh of STRING is zero (ie it is empty). |
= | STRING1 is equal to STRING2 |
!= | STRING1 is not equal to STRING2 |
-eq | INTEGER1 is numerically equal to INTEGER2 |
-gt | INTEGER1 is numerically greater than INTEGER2 |
-lt | INTEGER1 is numerically less than INTEGER2 |
-d | FILE exists and is a directory. |
-e | FILE exists. |
-r | FILE exists and the read permission is granted. |
-s | FILE exists and it's size is greater than zero (ie. it is not empty). |
-w | FILE exists and the write permission is granted. |
-x | FILE exists and the execute permission is granted. |
Regex
grep "<regex expression>" <file>
Operationen
Zeichen | Funktion |
---|---|
^ | 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
Octal | Decimal | Permission | Representation |
---|---|---|---|
000 | 0 | No Permission | --- |
001 | 1 | Execute | --x |
010 | 2 | Write | -w- |
011 | 3 | Write + Execute | -wx |
100 | 4 | Read | r-- |
101 | 5 | Read + Execute | r-x |
110 | 6 | Read + Write | rw- |
111 | 7 | Read + Write + Execute | rwx |
User | Group | Others |
---|---|---|
rwx | rwx | --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
head
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) |
---|---|---|
7 | 35 | 220 |
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
}