Bash CheatSheet (M122)
Datum: September 2021
Lesedauer: 7 Minuten
Hilfe
<command> --helpman <command>Scipts
Testen ob der Name noch frei ist
which scriptNameZeile 1 bestimmen
echo $SHELLScript erstellen (erste Zeile von vorheriger Ausgabe übernehmen)
#!/bin/bashAusführung
./scriptName.shScriptausführung erkennen/stoppen
Prozesse anzeigen
ps -lfAlternativ
topProzess beenden
kill <PID>Kommentare
# KommentarShell 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 $aRechnen
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 $answerif
if [ $1 -eq "hello" ] # see Comparer below
then
echo "welt"
else
echo "hh"
fiswitch
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"
;;
esacwhile
exit=0
while [ $exit -ne 1 ]
do
i=0
while [ $i -lt 10 ]
do
echo "."
sleep 1
((i++))
done
$exit=1
donefor
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
donefunction
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
./nameBefehlsübersicht
who
Angemeldete Benutzer
whoami
Eigener Benutzername
ls
Dateien auflisten
ls -lachmod
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.txtmv
Datei(en) umbenennen oder verschieben
cp oldName.txt newName.txtrm
Datei(en) löschen
rm bad.txtping
ping -c 1touch
Leere Datei erzeugen
touch newFile.txtfind
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_logouthead
Zeigt die ersten Zeilen einer Datei an
head -n 4 .bash_logouttail
Zeigt die letzten Zeilen einer Datei an
tail -n 3 .bash_logoutnano
Dateien editieren Speichern:
<CTRL>+Onautilus
Dateimanager starten Nautilus öffnen
sudo nautilusAchtung:
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.txtwc
Zeilen, Worte und Zeichen in einer Datei zählen
wc long.txtOutput:
| Zeilen (-l) | Wörter (-w) | Zeichen (-c) |
|---|---|---|
| 7 | 35 | 220 |
grep
Dateiinhalt durchsuchen Ist der Benutzer eingetragen
grep -e vmadmin /etc/passwdIn wievielen Zeilen kommt vm vor?
grep -c vm /etc/passwdsort
Dateiinhalt sortieren
sort -t ":" -k 2 flowers.txtcut
Dateiinhalt herausschneiden
cut -d " " -f 1,3 flowers.txttr
Dateiinhalt umwandeln
tr [:lower:] [:upper:] < flowers.txt
tr -s [:blank:] "\t" < flowers.txtpwd
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.txtErgebnis an Datei anhängen
ls >> folderContent.txtNur Treffer anzeigen
find / -name "*usb*.conf" 2>/dev/nullNur Fehler anzeigen
find / -name "*usb*.conf" 1>found.txtVollständige Ausgabe in der Datei und keine Ausgabe auf dem Bildschirm
find / -name "*usb*.conf" &>found+error.txtEingabeumlenkung
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.txtDatenweitergabe 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.txtHilfreiche 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
}