Shell 脚本
2026/1/16大约 2 分钟
Shell 脚本
基础语法
脚本结构
#!/bin/bash
# 这是注释
echo "Hello World"变量
# 定义变量(等号两边不能有空格)
name="Tom"
age=18
# 使用变量
echo $name
echo ${name}
echo "Hello, ${name}!"
# 只读变量
readonly PI=3.14
# 删除变量
unset name
# 特殊变量
$0 # 脚本名
$1 # 第一个参数
$# # 参数个数
$@ # 所有参数
$? # 上一个命令的返回值
$$ # 当前进程ID字符串
# 单引号:原样输出
str='hello $name'
# 双引号:可以包含变量
str="hello $name"
# 字符串长度
echo ${#str}
# 截取
echo ${str:0:5} # 从0开始取5个字符
# 查找替换
echo ${str/old/new} # 替换第一个
echo ${str//old/new} # 替换所有数组
# 定义数组
arr=(a b c d)
arr[0]="a"
# 访问元素
echo ${arr[0]}
echo ${arr[@]} # 所有元素
echo ${#arr[@]} # 数组长度
# 遍历
for item in ${arr[@]}; do
echo $item
done流程控制
条件判断
# if 语句
if [ condition ]; then
command
elif [ condition ]; then
command
else
command
fi
# 数值比较
-eq # 等于
-ne # 不等于
-gt # 大于
-lt # 小于
-ge # 大于等于
-le # 小于等于
# 字符串比较
= # 相等
!= # 不相等
-z # 为空
-n # 不为空
# 文件判断
-e # 存在
-f # 是文件
-d # 是目录
-r # 可读
-w # 可写
-x # 可执行
# 示例
if [ $age -gt 18 ]; then
echo "Adult"
fi
if [ -f "$file" ]; then
echo "File exists"
fi
if [ -z "$str" ]; then
echo "String is empty"
fi循环
# for 循环
for i in 1 2 3 4 5; do
echo $i
done
for i in {1..10}; do
echo $i
done
for ((i=0; i<10; i++)); do
echo $i
done
for file in *.txt; do
echo $file
done
# while 循环
while [ condition ]; do
command
done
# 读取文件
while read line; do
echo $line
done < file.txt
# until 循环
until [ condition ]; do
command
done
# break/continue
for i in {1..10}; do
if [ $i -eq 5 ]; then
break
fi
echo $i
donecase 语句
case $var in
pattern1)
command1
;;
pattern2)
command2
;;
*)
default_command
;;
esac
# 示例
case $1 in
start)
echo "Starting..."
;;
stop)
echo "Stopping..."
;;
restart)
echo "Restarting..."
;;
*)
echo "Usage: $0 {start|stop|restart}"
;;
esac函数
# 定义函数
function hello() {
echo "Hello, $1!"
}
# 或者
hello() {
echo "Hello, $1!"
}
# 调用函数
hello "World"
# 返回值
add() {
return $(($1 + $2))
}
add 1 2
echo $? # 获取返回值
# 获取输出
get_date() {
echo $(date +%Y-%m-%d)
}
today=$(get_date)实用脚本
日志清理
#!/bin/bash
LOG_DIR="/var/log/app"
DAYS=7
find $LOG_DIR -name "*.log" -mtime +$DAYS -exec rm -f {} \;
echo "Cleaned logs older than $DAYS days"服务监控
#!/bin/bash
SERVICE="nginx"
if ! pgrep -x "$SERVICE" > /dev/null; then
echo "$SERVICE is not running, starting..."
systemctl start $SERVICE
fi备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
tar -czvf $BACKUP_DIR/backup_$DATE.tar.gz $SOURCE_DIR
# 删除7天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete部署脚本
#!/bin/bash
APP_NAME="myapp"
JAR_FILE="$APP_NAME.jar"
LOG_FILE="$APP_NAME.log"
stop() {
PID=$(pgrep -f $JAR_FILE)
if [ -n "$PID" ]; then
kill $PID
echo "Stopped $APP_NAME"
fi
}
start() {
nohup java -jar $JAR_FILE > $LOG_FILE 2>&1 &
echo "Started $APP_NAME"
}
case $1 in
start) start ;;
stop) stop ;;
restart) stop; sleep 2; start ;;
*) echo "Usage: $0 {start|stop|restart}" ;;
esac