Bash - Bourne Again Shell¶
Bash (Bourne Again Shell) ist eine Unix Shell und Befehlssprache, die Brian Fox für das GNU Project als freier Softwareersatz für die Bourne Shell geschrieben hat. Bash wurde 1989 zum Standard-Shell auf den meisten Linux-Distributionen und ist eine der am weitesten verbreiteten Shells im Unix/Linux-Ökosystem. Es kombiniert die Eigenschaften der ursprünglichen Bourne Shell mit zusätzlicher Funktionalität, einschließlich Befehlsvollständigkeit, Befehlsgeschichte und verbesserten Skriptfunktionen.
Installation und Inbetriebnahme¶
Prüfung Bash Installation¶
```bash
Check if Bash is installed¶
which bash /bin/bash
Check Bash version¶
bash --version GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Check current shell¶
echo $SHELL /bin/bash
Check available shells¶
cat /etc/shells ```_
Bash als Standard Shell¶
```bash
Set Bash as default shell for current user¶
chsh -s /bin/bash
Set Bash as default shell for specific user (as root)¶
sudo chsh -s /bin/bash username
Verify shell change¶
echo $SHELL ```_
Bash Installation auf verschiedenen Systemen¶
```bash
Ubuntu/Debian¶
sudo apt update && sudo apt install bash
CentOS/RHEL/Fedora¶
sudo dnf install bash
macOS (using Homebrew for latest version)¶
brew install bash
Arch Linux¶
sudo pacman -S bash
FreeBSD¶
pkg install bash ```_
Bash Syntax und Befehle¶
Befehlsstruktur¶
```bash
Basic command structure¶
command [options] [arguments]
Examples¶
ls -la /home cp file1.txt file2.txt grep -r "pattern" /path/to/search ```_
Varianten und Umwelt¶
```bash
Variable assignment (no spaces around =)¶
name="John Doe" age=30 path="/home/user"
Using variables¶
echo $name echo $\\{name\\} echo "Hello, $name"
Environment variables¶
export PATH="/usr/local/bin:$PATH" export EDITOR="vim"
Special variables¶
echo $0 # Script name echo $1 # First argument echo $# # Number of arguments echo $@ # All arguments echo $ # Process ID echo $? # Exit status of last command ```_
Kommando Substitution¶
```bash
Using $() (preferred)¶
current_date=\((date) file_count=\)(ls|wc -l) user_home=\((eval echo ~\)USER)
Using backticks (legacy)¶
current_date=date
file_count=ls|wc -l
Nested command substitution¶
echo "Today is $(date +%A), $(date +%B) $(date +%d)" ```_
Zitat und Entkommen¶
```bash
Single quotes (literal)¶
echo 'The variable $HOME is not expanded'
Double quotes (variable expansion)¶
echo "Your home directory is $HOME"
Escaping special characters¶
echo "The price is $10" echo "Use \"quotes\" inside quotes"
Here documents¶
cat << EOF This is a multi-line text block that can contain variables like $HOME EOF
Here strings¶
grep "pattern" <<< "$variable" ```_
Dateioperationen und Navigation¶
Navigationsverzeichnis¶
```bash
Change directory¶
cd /path/to/directory cd ~ # Home directory cd - # Previous directory cd .. # Parent directory cd ../.. # Two levels up
Print working directory¶
pwd
Directory stack operations¶
pushd /path/to/dir # Push directory onto stack popd # Pop directory from stack dirs # Show directory stack ```_
Datei und Verzeichnis Listing¶
```bash
Basic listing¶
ls ls -l # Long format ls -la # Long format with hidden files ls -lh # Human readable sizes ls -lt # Sort by modification time ls -lS # Sort by size ls -lR # Recursive listing
Advanced listing options¶
ls -la --color=auto # Colored output ls -la --time-style=full-iso # ISO time format ls -la --group-directories-first # Directories first ```_
Dateioperationen¶
```bash
Create files¶
touch file.txt touch file1.txt file2.txt file3.txt
Copy files and directories¶
cp source.txt destination.txt cp -r source_dir/ destination_dir/ cp -p file.txt backup.txt # Preserve attributes cp -u source.txt dest.txt # Update only if newer
Move and rename¶
mv old_name.txt new_name.txt mv file.txt /path/to/destination/ mv *.txt /path/to/directory/
Remove files and directories¶
rm file.txt rm -f file.txt # Force removal rm -r directory/ # Recursive removal rm -rf directory/ # Force recursive removal rm -i *.txt # Interactive removal
Create directories¶
mkdir directory_name mkdir -p path/to/nested/directory mkdir -m 755 directory_name # With specific permissions ```_
File Berechtigungen und Eigentum¶
```bash
Change permissions¶
chmod 755 file.txt chmod u+x script.sh # Add execute for user chmod g-w file.txt # Remove write for group chmod o=r file.txt # Set read-only for others chmod -R 644 directory/ # Recursive permission change
Change ownership¶
chown user:group file.txt chown -R user:group directory/ chgrp group file.txt # Change group only
View permissions¶
ls -l file.txt stat file.txt # Detailed file information ```_
Textverarbeitung und Manipulation¶
File Content Operationen¶
```bash
View file contents¶
cat file.txt # Display entire file less file.txt # Paginated view more file.txt # Simple paginated view head file.txt # First 10 lines head -n 20 file.txt # First 20 lines tail file.txt # Last 10 lines tail -n 20 file.txt # Last 20 lines tail -f file.txt # Follow file changes
File comparison¶
diff file1.txt file2.txt diff -u file1.txt file2.txt # Unified format cmp file1.txt file2.txt # Binary comparison ```_
Textsuche und Filterung¶
```bash
grep - pattern searching¶
grep "pattern" file.txt grep -i "pattern" file.txt # Case insensitive grep -r "pattern" directory/ # Recursive search grep -n "pattern" file.txt # Show line numbers grep -v "pattern" file.txt # Invert match grep -E "pattern1|pattern2" file.txt # Extended regex
Advanced grep options¶
grep -A 3 "pattern" file.txt # Show 3 lines after match grep -B 3 "pattern" file.txt # Show 3 lines before match grep -C 3 "pattern" file.txt # Show 3 lines around match grep -l "pattern" *.txt # Show only filenames grep -c "pattern" file.txt # Count matches ```_
Textverarbeitungswerkzeuge¶
```bash
sed - stream editor¶
sed 's/old/new/' file.txt # Replace first occurrence sed 's/old/new/g' file.txt # Replace all occurrences sed '1,5s/old/new/g' file.txt # Replace in lines 1-5 sed '/pattern/d' file.txt # Delete lines matching pattern sed -n '1,10p' file.txt # Print lines 1-10
awk - pattern scanning and processing¶
awk '\\{print $1\\}' file.txt # Print first column awk '\\{print $NF\\}' file.txt # Print last column awk '/pattern/ \\{print $0\\}' file.txt # Print lines matching pattern awk -F: '\\{print $1\\}' /etc/passwd # Use : as field separator awk '\\{sum += $1\\} END \\{print sum\\}' file.txt # Sum first column
cut - extract columns¶
cut -d: -f1 /etc/passwd # Extract first field cut -c1-10 file.txt # Extract characters 1-10 cut -f2,4 file.txt # Extract fields 2 and 4
sort and uniq¶
sort file.txt # Sort lines sort -n file.txt # Numeric sort sort -r file.txt # Reverse sort sort -k2 file.txt # Sort by second field uniq file.txt # Remove duplicate lines sort file.txt|uniq -c # Count occurrences ```_
Input/Output Redirection und Pipes¶
Umleitungsbetreiber¶
```bash
Output redirection¶
command > file.txt # Redirect stdout to file (overwrite) command >> file.txt # Redirect stdout to file (append) command 2> error.log # Redirect stderr to file command 2>> error.log # Redirect stderr to file (append) command &> output.log # Redirect both stdout and stderr command > output.log 2>&1 # Redirect both stdout and stderr
Input redirection¶
command < input.txt # Read input from file command << EOF # Here document line 1 line 2 EOF
Advanced redirection¶
command 3> file.txt # Redirect to file descriptor 3 exec 3> file.txt # Open file descriptor 3 echo "text" >&3 # Write to file descriptor 3 exec 3>&- # Close file descriptor 3 ```_
Rohre und Kommandoketten¶
```bash
Basic pipes¶
ls -l|grep "txt" # List files and filter for .txt ps aux|grep "process_name" # Show processes and filter cat file.txt|sort|uniq # Sort and remove duplicates
Complex pipe chains¶
cat /var/log/access.log|grep "404"|awk '\\{print $1\\}'|sort|uniq -c|sort -nr find . -name "*.log"|xargs grep "ERROR"|cut -d: -f1|sort|uniq
Tee command (split output)¶
command|tee file.txt # Write to file and stdout command|tee -a file.txt # Append to file and stdout ```_
Prozessmanagement¶
Job Control¶
```bash
Background and foreground jobs¶
command & # Run command in background jobs # List active jobs fg %1 # Bring job 1 to foreground bg %1 # Send job 1 to background kill %1 # Kill job 1
Process control signals¶
Ctrl+C # Interrupt (SIGINT) Ctrl+Z # Suspend (SIGTSTP) Ctrl+ # Quit (SIGQUIT) ```_
Informationen zum Thema¶
```bash
Process listing¶
ps # Show current processes ps aux # Show all processes ps -ef # Full format listing pstree # Show process tree top # Real-time process monitor htop # Enhanced process monitor
Process management¶
kill PID # Terminate process kill -9 PID # Force kill process killall process_name # Kill all processes by name pkill pattern # Kill processes matching pattern nohup command & # Run command immune to hangups ```_
Bash Scripting Grundlagen¶
Schriftstruktur¶
```bash
!/bin/bash¶
Script description and metadata¶
Author: Your Name¶
Date: YYYY-MM-DD¶
Version: 1.0¶
Script content starts here¶
echo "Hello, World!" ```_
Variablen und Datentypen¶
```bash
String variables¶
name="John Doe" message='Hello, World!' multiline="This is a multi-line string"
Numeric variables¶
number=42 pi=3.14159
Arrays¶
fruits=("apple" "banana" "orange") numbers=(1 2 3 4 5)
Associative arrays (Bash 4+)¶
declare -A colors colors[red]="#FF0000" colors[green]="#00FF00" colors[blue]="#0000FF"
Array operations¶
echo $\\{fruits[0]\\} # First element echo $\\{fruits[@]\\} # All elements echo $\\{#fruits[@]\\} # Array length fruits+=("grape") # Append element ```_
Bedingte Aussagen¶
```bash
if-then-else¶
if [ condition ]; then echo "Condition is true" elif [ other_condition ]; then echo "Other condition is true" else echo "No condition is true" fi
Test conditions¶
if [ "\(var" = "value" ]; then # String equality if [ "\)num" -eq 10 ]; then # Numeric equality if [ "\(num" -gt 5 ]; then # Greater than if [ "\)num" -lt 20 ]; then # Less than if [ -f "file.txt" ]; then # File exists if [ -d "directory" ]; then # Directory exists if [ -r "file.txt" ]; then # File is readable if [ -w "file.txt" ]; then # File is writable if [ -x "script.sh" ]; then # File is executable
Logical operators¶
if [ condition1 ] && [ condition2 ]; then # AND if [ condition1 ]||[ condition2 ]; then # OR if [ ! condition ]; then # NOT
Case statement¶
case $variable in pattern1) echo "Matched pattern1" ;; pattern2|pattern3) echo "Matched pattern2 or pattern3" ;; *) echo "No pattern matched" ;; esac ```_
Loops¶
```bash
for loop¶
for i in \\{1..10\\}; do echo "Number: $i" done
for file in *.txt; do echo "Processing: $file" done
for item in "$\\{array[@]\\}"; do echo "Item: $item" done
C-style for loop¶
for ((i=1; i<=10; i++)); do echo "Counter: $i" done
while loop¶
counter=1 while [ $counter -le 10 ]; do echo "Counter: $counter" ((counter++)) done
until loop¶
counter=1 until [ $counter -gt 10 ]; do echo "Counter: $counter" ((counter++)) done
Loop control¶
for i in \\{1..10\\}; do if [ $i -eq 5 ]; then continue # Skip iteration fi if [ $i -eq 8 ]; then break # Exit loop fi echo $i done ```_
Funktionen¶
```bash
Function definition¶
function greet() \\{ echo "Hello, $1!" \\}
Alternative syntax¶
greet() \\{ echo "Hello, $1!" \\}
Function with return value¶
calculate_sum() \\{ local num1=\(1 local num2=\)2 local sum=$((num1 + num2)) echo $sum \\}
Function with local variables¶
process_file() \\{ local filename=\(1 local line_count=\)(wc -l < "$filename") echo "File $filename has $line_count lines" \\}
Function usage¶
greet "World" result=$(calculate_sum 5 3) echo "Sum: $result" ```_
Erweiterte Bash-Funktionen¶
Parametererweiterung¶
```bash
Basic parameter expansion¶
echo $\\{variable\\} echo $\\{variable:-default\\} # Use default if unset echo $\\{variable:=default\\} # Set default if unset echo $\\{variable:+alternate\\} # Use alternate if set echo $\\{variable:?error\\} # Error if unset
String manipulation¶
string="Hello, World!" echo $\\{string#Hello\\} # Remove shortest match from beginning echo $\\{string##/\\} # Remove longest match from beginning echo $\\{string%World!\\} # Remove shortest match from end echo $\\{string%%/\\} # Remove longest match from end echo $\\{string/Hello/Hi\\} # Replace first occurrence echo $\\{string//l/L\\} # Replace all occurrences
Substring extraction¶
echo $\\{string:0:5\\} # Extract substring (position:length) echo $\\{string:7\\} # Extract from position to end echo $\\{#string\\} # String length ```_
Arithmetische Operationen¶
```bash
Arithmetic expansion¶
result=\(((5 + 3)) result=\)((10 * 2)) result=\(((20 / 4)) result=\)((17 % 5)) # Modulo
Increment/decrement¶
((counter++)) ((counter--)) ((counter += 5)) ((counter -= 3))
Arithmetic with variables¶
num1=10 num2=5 sum=\(((num1 + num2)) product=\)((num1 * num2))
Floating point arithmetic (using bc)¶
result=\((echo "scale=2; 10/3"|bc) result=\)(echo "scale=4; sqrt(16)"|bc -l) ```_
Fehlerbehebung¶
```bash
Exit on error¶
set -e # Exit on any error set -u # Exit on undefined variable set -o pipefail # Exit on pipe failure
Error handling in scripts¶
command||\\{ echo "Command failed" exit 1 \\}
Trap signals¶
trap 'echo "Script interrupted"; exit 1' INT TERM trap 'cleanup_function' EXIT
Function error handling¶
safe_command() \\{ if ! command_that_might_fail; then echo "Error: Command failed" >&2 return 1 fi \\} ```_
Konfiguration und Anpassung¶
Bash Konfigurationsdateien¶
```bash
System-wide configuration¶
/etc/bash.bashrc # System-wide bashrc /etc/profile # System-wide profile
User-specific configuration¶
~/.bashrc # User's bashrc ~/.bash_profile # User's profile ~/.bash_login # Login shell configuration ~/.profile # POSIX shell profile ~/.bash_logout # Logout script ```_
Personalisierung .bashrc¶
```bash
~/.bashrc example configuration¶
Source global definitions¶
if [ -f /etc/bashrc ]; then . /etc/bashrc fi
User specific environment¶
export EDITOR="vim" export BROWSER="firefox" export PAGER="less"
Custom PATH¶
export PATH="\(HOME/bin:\)HOME/.local/bin:$PATH"
Aliases¶
alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto'
Custom functions¶
mkcd() \\{ mkdir -p "\(1" && cd "\)1" \\}
extract() \\{ if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar e $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress \(1 ;; *.7z) 7z x \(1 ;; *) echo "'\)1' cannot be extracted via extract()" ;; esac else echo "'\)1' is not a valid file" fi \\}
Prompt customization¶
PS1='[\033[01;32m]\u@\h[\033[00m]:[\033[01;34m]\w[\033[00m]$ '
History configuration¶
HISTSIZE=10000 HISTFILESIZE=20000 HISTCONTROL=ignoredups:ignorespace shopt -s histappend
Shell options¶
shopt -s checkwinsize shopt -s globstar shopt -s cdspell ```_
Bash Optionen und Einstellungen¶
```bash
Set options¶
set -o vi # Vi editing mode set -o emacs # Emacs editing mode (default) set -o noclobber # Prevent file overwriting set +o noclobber # Allow file overwriting
Shopt options¶
shopt -s autocd # Auto cd to directory shopt -s cdspell # Correct minor spelling errors shopt -s checkwinsize # Update LINES and COLUMNS shopt -s cmdhist # Save multi-line commands shopt -s dotglob # Include hidden files in globbing shopt -s expand_aliases # Expand aliases shopt -s extglob # Extended globbing shopt -s globstar # ** recursive globbing shopt -s histappend # Append to history file shopt -s nocaseglob # Case-insensitive globbing ```_
Befehlszeile Editing und Geschichte¶
Befehlszeile Bearbeiten¶
```bash
Emacs mode (default)¶
Ctrl+A # Beginning of line Ctrl+E # End of line Ctrl+B # Back one character Ctrl+F # Forward one character Alt+B # Back one word Alt+F # Forward one word Ctrl+D # Delete character Ctrl+H # Backspace Ctrl+K # Kill to end of line Ctrl+U # Kill to beginning of line Ctrl+W # Kill previous word Alt+D # Kill next word Ctrl+Y # Yank (paste) Ctrl+T # Transpose characters Alt+T # Transpose words
Vi mode¶
set -o vi Esc # Enter command mode i # Insert mode a # Append mode A # Append at end of line I # Insert at beginning of line ```_
Geschichte Management¶
```bash
History commands¶
history # Show command history history 10 # Show last 10 commands history -c # Clear history history -d 5 # Delete history entry 5
History expansion¶
!! # Previous command !n # Command number n !string # Last command starting with string !?string # Last command containing string oldnew # Replace old with new in previous command
History search¶
Ctrl+R # Reverse search Ctrl+S # Forward search Ctrl+G # Cancel search
History configuration¶
export HISTSIZE=10000 # Commands in memory export HISTFILESIZE=20000 # Commands in file export HISTCONTROL=ignoredups # Ignore duplicates export HISTIGNORE="ls:ll:cd:pwd:bg:fg:history" # Ignore commands export HISTTIMEFORMAT="%F %T " # Add timestamps ```_
Debugging und Fehlerbehebung¶
Debugging Scripts¶
```bash
Debug modes¶
bash -x script.sh # Execute with trace bash -n script.sh # Check syntax without execution bash -v script.sh # Verbose mode
Debug options in script¶
set -x # Enable trace set +x # Disable trace set -v # Enable verbose set +v # Disable verbose
Conditional debugging¶
if [ "$DEBUG" = "1" ]; then set -x fi
Debug function¶
debug() \\{ if [ "$DEBUG" = "1" ]; then echo "DEBUG: $*" >&2 fi \\} ```_
Fehlersuche¶
```bash
Check command success¶
if command; then echo "Command succeeded" else echo "Command failed" fi
Check exit status¶
command if [ $? -eq 0 ]; then echo "Success" else echo "Failed with exit code $?" fi
Validate input¶
if [ $# -ne 2 ]; then
echo "Usage: $0
Check file existence¶
if [ ! -f "$filename" ]; then echo "Error: File $filename does not exist" exit 1 fi ```_
Leistungsüberwachung¶
```bash
Time command execution¶
time command time \\{ command1; command2; \\}
Profile script execution¶
PS4='+ $(date "+%s.%N"): ' set -x
Your commands here¶
set +x
Memory usage¶
/usr/bin/time -v command
Disk usage¶
du -sh directory/ df -h ```_
Best Practices und Sicherheit¶
Script Security¶
```bash
Use full paths for commands¶
/bin/ls instead of ls /usr/bin/find instead of find
Validate input¶
case "$input" in [a-zA-Z0-9]*) # Valid input ;; *) echo "Invalid input" exit 1 ;; esac
Quote variables¶
rm "$filename" # Correct rm $filename # Dangerous
Use arrays for file lists¶
files=( *.txt ) for file in "\(\\\\{files[@]\\\\}"; do process "\)file" done ```_
Performance Best Practices¶
```bash
Use built-in commands when possible¶
[[ condition ]] # Instead of [ condition ] (( arithmetic )) # Instead of [ arithmetic ]
Avoid unnecessary subshells¶
var=\((cat file) # Subshell var=\)(<file) # Built-in
Use parameter expansion¶
$\\{var#pattern\\} # Instead of sed/awk for simple operations $\\{var%pattern\\} $\\{var/pattern/replacement\\}
Efficient loops¶
while IFS= read -r line; do # Read file line by line process "$line" done < file.txt ```_
Code Organisation¶
```bash
Use functions for repeated code¶
log_message() \\{ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >&2 \\}
Separate configuration¶
CONFIG_FILE="\(\\\\{HOME\\\\}/.myapp.conf" if [ -f "\)CONFIG_FILE" ]; then source "$CONFIG_FILE" fi
Use meaningful variable names¶
user_count=10 # Good uc=10 # Poor
Comment complex logic¶
Calculate the number of days between two dates¶
start_date=\((date -d "\)1" +%s) end_date=\((date -d "\)2" +%s) days=$(( (end_date - start_date) / 86400 )) ```_
Bash bleibt die am weitesten verbreitete Shell in Unix- und Linux-Umgebungen und bietet eine leistungsstarke Kombination aus interaktiver Kommandozeilenschnittstelle und Skriptsprache. Sein umfangreiches Feature-Set, die POSIX-Compliance und die breite Verfügbarkeit machen es zu einem unverzichtbaren Werkzeug für Systemadministratoren, Entwickler und Power-User. Ob für einfache Befehlsausführung oder komplexe Automatisierungsskripte, Bash bietet die Flexibilität und Zuverlässigkeit, die für professionelle Rechenumgebungen benötigt wird.