在Linux系统中,脚本(Script)是通过解释器执行的文本文件,用于自动化重复任务、管理系统或部署应用,以下是详细的脚本编写指南,遵循Linux最佳实践:
脚本基础结构
-
Shebang行(必需)
首行指定解释器路径,告知系统用哪个程序执行脚本:#!/bin/bash # 使用Bash解释器 #!/usr/bin/env python3 # 跨平台指定Python3
-
注释(推荐)
用 添加说明,提高可读性:# 脚本功能:备份日志文件 # 作者:YourName # 日期:2025-10-01
-
按顺序编写命令,每行一条:
echo "当前用户:$(whoami)" # 输出当前用户 date # 显示系统时间
创建与执行脚本
步骤1:创建脚本文件
nano myscript.sh # 使用nano编辑器创建文件
步骤2:赋予执行权限
chmod +x myscript.sh # 添加可执行权限
步骤3:运行脚本
./myscript.sh # 当前目录执行 bash myscript.sh # 显式指定Bash执行(无需权限)
核心语法详解
变量操作
name="Linux" # 定义变量 echo "Hello $name" # 输出:Hello Linux path=$(pwd) # 命令结果赋值给变量 read -p "输入用户名: " user # 接收用户输入
条件判断
if [ -f "/etc/passwd" ]; then echo "文件存在" elif [ -d "/tmp" ]; then echo "/tmp是目录" else echo "条件不满足" fi
常用判断符:-eq
(等于) -ne
(不等于) -z
(字符串为空)-f
(是文件) -d
(是目录) -r
(可读)
循环控制
- for循环:
for i in {1..5}; do echo "第$i次循环" done
- while循环:
count=1 while [ $count -le 3 ]; do echo "Count: $count" ((count++)) done
函数定义
cp /var/log/syslog /backup/syslog_$(date +%F).log
}
# 调用函数
log_backup
实用脚本示例
示例1:自动备份文件
#!/bin/bash # 备份/var/log目录到/home/backup backup_dir="/home/backup" log_dir="/var/log" if [ ! -d "$backup_dir" ]; then mkdir -p "$backup_dir" fi tar -czf "$backup_dir/logs_$(date +%Y%m%d).tar.gz" "$log_dir" echo "备份完成!"
示例2:服务状态监控
#!/bin/bash # 检查Nginx是否运行 if systemctl is-active --quiet nginx; then echo "Nginx正在运行" else echo "Nginx未启动,尝试重启..." systemctl start nginx fi
脚本调试与优化
- 调试模式:
bash -x myscript.sh # 打印每条执行的命令
- 错误处理:
set -e # 任何命令失败时立即退出脚本 set -o pipefail # 管道命令失败时退出
- 日志记录:
exec > >(tee /var/log/script.log) 2>&1 # 输出重定向到日志文件
安全与最佳实践
-
权限最小化
- 用
chmod
限制权限:chmod 700 myscript.sh
(仅所有者可读写执行) - 避免使用
root
运行脚本,除非必要
- 用
-
输入验证
对用户输入进行过滤:if [[ ! "$input" =~ ^[a-zA-Z0-9_]+$ ]]; then echo "非法输入!" exit 1 fi
-
代码规范
- 使用缩进(空格或Tab)
- 变量名使用小写+下划线(如
backup_dir
) - 关键操作添加注释
学习资源
- 官方文档:
Bash参考手册
Linux Man Pages - 书籍推荐:
《Linux命令行与shell脚本编程大全》
《Advanced Bash-Scripting Guide》 - 工具验证:
ShellCheck(在线脚本语法检查)
引用说明基于Linux 5.15内核及Bash 5.1版本验证,参考GNU Bash手册、Linux文档项目(TLDP)及Red Hat系统管理员指南,实践前请确保环境兼容性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5529.html