Bash - Bourne Again Shell¶
# 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 (Bourne Again Shell) ist eine Unix-Shell und Befehlssprache, die von Brian Fox für das GNU-Projekt als freier Software-Ersatz für die Bourne Shell entwickelt wurde. Erstmals 1989 veröffentlicht, ist Bash zur Standardshell auf den meisten Linux-Distributionen geworden und ist eine der am häufigsten verwendeten Shells im Unix/Linux-Ökosystem. Sie kombiniert die Funktionen der ursprünglichen Bourne Shell mit zusätzlichen Funktionen wie Befehlsergänzung, Befehlsverlauf und verbesserten Skriptfähigkeiten.
## Installation und Einrichtung
### Bash-Installation überprüfen
```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 als Standardshell festlegen¶
# 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-Installation auf verschiedenen Systemen¶
# Basic command structure
command [options] [arguments]
# Examples
ls -la /home
cp file1.txt file2.txt
grep -r "pattern" /path/to/search
Grundlegende Bash-Syntax und Befehle¶
Befehlsstruktur¶
# 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
Variablen und Umgebung¶
# 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)"
Befehlssubstitution¶
# 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"
Anführungszeichen und Escaping¶
# 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
Dateioperationen und Navigation¶
Verzeichnisnavigation¶
# 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
Datei- und Verzeichnislisting¶
# 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
Dateioperationen¶
# 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
Dateiberechtigungen und Besitz¶
# 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
Textverarbeitung und -manipulation¶
Dateiinhaltsoperationen¶
# 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
Textsuche und Filterung¶
# 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
Textverarbeitungstools¶
# 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
Ein-/Ausgabe-Umleitung und Pipes¶
Umleitungsoperatoren¶
# 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
Pipes und Befehlsverkettung¶
# 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)
Prozessverwaltung¶
Jobkontrolle¶
# 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
Prozessinformationen¶
```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 Datentypenbash
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 Anweisungenbash
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
### Schleifenbash
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
### Funktionenbash
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-Funktionenbash
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
### Parameterexpansionbash
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)
### Arithmetische Operationenbash
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
\\}
### Fehlerbehandlungbash
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
## Konfiguration und Anpassungbash
~/.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-Konfigurationsdateienbash
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
### .bashrc anpassenbash
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
### Bash-Optionen und Einstellungenbash
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
## Befehlszeilenbearbeitung und Verlaufbash
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
\\}
### Befehlszeilenbearbeitungbash
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
### Verlaufsverwaltungbash
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
## Debugging und Fehlerbehebungbash
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
### Debugging von Skriptenbash
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
### Fehlerüberprüfungbash
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 )) ```### Leistungsüberwachung