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 ^old^new # 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.