2021
Bash

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

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

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)
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
}