Bash(Bourne Again Shell)是 GNU 项目为 Unix/Linux 系统开发的 Shell 程序,由 Brian Fox 于 1989 年创建。Bash 是大多数 Linux 发行版和 macOS 的默认 Shell,也是 系统管理员和 DevOps 工程师最核心的工具。
Bash 的核心定位是 系统自动化与进程管理。它提供了:
Bash 由 Brian Fox 于 1989 年为 GNU 项目编写,作为 Bourne Shell(sh)的替代品。Bash 融合了 sh、csh、ksh 等多个 Shell 的优点,成为 Linux 系统默认的 Shell。
#!/bin/bash
# 这是注释
# 变量赋值(等号两侧不能有空格)
name="World"
age=25
# 使用变量
echo "Hello, $name!"
# 命令替换
current_dir=$(pwd)
echo "Current directory: $current_dir"
# 算术运算
sum=$((10 + 20))
echo "Sum: $sum"
# 条件判断
if [ $age -gt 18 ]; then
echo "Adult"
else
echo "Minor"
fi
# 循环
for i in {1..5}; do
echo "Number: $i"
done
# while 循环
count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
count=$((count + 1))
done
# case 语句
case $name in
"Alice")
echo "Hello Alice!"
;;
"Bob")
echo "Hi Bob!"
;;
*)
echo "Hello stranger!"
;;
esac
# 函数定义
greet() {
local name=$1
echo "Hello, $name!"
}
greet "World"
arr=("apple" "banana" "orange")declare -A dict; dict["key"]="value"export PATH=$PATH:/usr/local/bin$0:脚本名称$1、$2:位置参数$#:参数个数$@:所有参数$?:上一个命令的退出码$$:当前进程 ID# grep - 文本搜索
grep "error" /var/log/syslog
grep -r "TODO" ./src/
# sed - 流编辑器
sed "s/old/new/g" file.txt
sed -n "10,20p" file.txt # 打印 10-20 行
# awk - 文本处理
awk "{print $1, $3}" file.txt
awk "$1 > 100 {print $0}" data.txt
awk -F"," "{print $2}" data.csv # 指定分隔符
# cut - 切割文本
cut -d"," -f1,3 data.csv
# sort - 排序
sort -n -k2 data.txt # 按第二列数值排序
# uniq - 去重
sort file.txt | uniq
sort file.txt | uniq -c # 统计出现次数
# wc - 统计
wc -l file.txt # 行数
wc -w file.txt # 单词数
wc -c file.txt # 字符数
# xargs - 参数传递
ls *.txt | xargs rm -f
find . -name "*.log" | xargs grep "ERROR"
# 管道 - 连接命令
ps aux | grep nginx | grep -v grep
# 输出重定向
echo "Hello" > file.txt # 覆盖
echo "World" >> file.txt # 追加
# 错误重定向
command 2> error.log
command 2>&1 # 错误重定向到标准输出
# 同时输出到文件和终端
command | tee output.log
# 输入重定向
sort < unsorted.txt
# 文件判断
if [ -f file.txt ]; then
echo "File exists"
fi
if [ -d /usr/bin ]; then
echo "Directory exists"
fi
if [ -e /path/to/thing ]; then
echo "Exists"
fi
# 字符串判断
if [ -z "$var" ]; then
echo "Variable is empty"
fi
if [ -n "$var" ]; then
echo "Variable is not empty"
fi
if [ "$name" = "Alice" ]; then
echo "Hello Alice"
fi
# 数值判断
if [ $num -eq 10 ]; then
echo "Equals 10"
fi
# -eq (等于)、-ne (不等于)、-gt (大于)、-lt (小于)
# -ge (大于等于)、-le (小于等于)
# for 循环
for file in *.txt; do
echo "Processing $file"
done
# 数值范围
for i in {1..10}; do
echo $i
done
# while 循环
while read line; do
echo "$line"
done < file.txt
# until 循环(条件为假时执行)
until [ $count -ge 10 ]; do
echo $count
count=$((count + 1))
done
# select 菜单
select option in "Start" "Stop" "Restart"; do
case $option in
"Start") echo "Starting..." ;;
"Stop") echo "Stopping..." ;;
"Restart") echo "Restarting..." ;;
*) break ;;
esac
done
# 定义函数
function greet() {
local name=$1
echo "Hello, $name!"
}
# 调用函数
greet "World"
# 函数返回值
function add() {
return $(( $1 + $2 ))
}
add 10 20
echo "Result: $?"
# 函数输出捕获
function get_date() {
echo "$(date)"
}
today=$(get_date)
# 捕获信号
trap "echo Script interrupted; exit 1" INT TERM
# 执行脚本时显示调试信息
set -x # 打开调试
set +x # 关闭调试
# 错误时退出
set -e
# 检查命令是否存在
if command -v docker &> /dev/null; then
echo "Docker is installed"
else
echo "Docker is not installed"
fi
# 获取脚本所在目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# 颜色输出
echo -e "\033[31mRed text\033[0m"
echo -e "\033[32mGreen text\033[0m"
echo -e "\033[33mYellow text\033[0m"
#!/bin/bash
# 统计日志中的错误次数
ERROR_COUNT=$(grep -c "ERROR" /var/log/app.log)
WARNING_COUNT=$(grep -c "WARNING" /var/log/app.log)
echo "Errors: $ERROR_COUNT"
echo "Warnings: $WARNING_COUNT"
# 显示最近 10 条错误
grep "ERROR" /var/log/app.log | tail -10
#!/bin/bash
# 备份指定目录
SOURCE_DIR="/home/user/data"
BACKUP_DIR="/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_$TIMESTAMP.tar.gz"
tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR"
if [ $? -eq 0 ]; then
echo "Backup successful: $BACKUP_FILE"
else
echo "Backup failed"
exit 1
fi
# 删除 30 天前的备份
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete
#!/bin/bash
# 服务健康检查
SERVICE_NAME="nginx"
if systemctl is-active --quiet $SERVICE_NAME; then
echo "$SERVICE_NAME is running"
else
echo "$SERVICE_NAME is down, restarting..."
systemctl restart $SERVICE_NAME
echo "Restarted $SERVICE_NAME"
fi
#!/bin/bash
# 批量重命名文件
for file in *.jpg; do
mv "$file" "${file%.jpg}_processed.jpg"
done
# 批量替换文件内容
find . -name "*.txt" -exec sed -i "s/old_text/new_text/g" {} \;
Bash 基础命令、变量、参数、条件判断、循环
grep、sed、awk、cut、sort、uniq、xargs
日志分析、文件备份、服务管理、批量处理
调试技巧、性能优化、复杂脚本架构
Bash 是 Linux 世界的"万能胶水"。
它可能不是最优雅的语言,但它是 系统管理、自动化部署、DevOps 的核心工具。任何 Linux 服务器、Docker 容器、CI/CD 流水线中,Bash 脚本都无处不在。
掌握 Bash 意味着你能 高效地管理服务器、自动化重复任务、快速处理文本数据。无论你是后端开发者、运维工程师还是 DevOps 专家,Bash 都是必备技能。
"Bash 是系统管理员的瑞士军刀。" 🔧