Linux脚本文件是自动化任务的核心工具,通过将一系列命令组合为可执行的脚本,能大幅提升系统管理效率,编写Linux脚本需掌握基础语法、逻辑控制及调试技巧,以下是详细步骤和要点。
脚本基础与创建
Linux脚本通常以Shell语言编写,最常用的是Bash(Bourne Again Shell),创建脚本文件时,需以.sh
为后缀(非强制,但便于识别),例如backup.sh
,首先用文本编辑器(如vim
、nano
)创建文件,第一行必须指定解释器,称为Shebang行,格式为#!/bin/bash
(告知系统用Bash执行该脚本)。
#!/bin/bash echo "Hello, Linux Script!"
基本语法要素
变量与赋值
Shell变量无需声明类型,直接用赋值,等号两侧不能有空格,变量名需以字母或下划线开头,避免使用Shell关键字(如if
、for
),引用变量时需加符号,如:
name="Linux" echo "Hello, $name!" # 输出:Hello, Linux! echo '${name}' # 单引号不展开变量,输出:${name}
变量类型:
| 类型 | 说明 | 示例 |
|————|——————————-|————————–|
| 自定义变量 | 用户定义,作用域为当前脚本 | count=10
|
| 环境变量 | 系统内置,所有子进程可用 | $HOME
(用户目录) |
| 特殊变量 | Shell内置,表示参数或状态 | $0
(脚本名)、(参数个数) |
注释
单行注释用,多行注释可用 <<'BLOCK' ... BLOCK
(或 <<'EOF' ... EOF
):
# 这是一个单行注释 : <<'COMMENT' 这是多行注释 用于说明复杂逻辑 COMMENT
流程控制
条件判断
if
语句通过test
命令或[]
(需与命令间有空格)判断条件,常见条件类型:
- 文件测试:
-e
(存在)、-f
(普通文件)、-d
(目录) - 数值比较:
-eq
(等于)、-gt
(大于) - 字符串比较:(等于)、(不等)
示例:判断文件是否存在
if [ -f "/etc/passwd" ]; then echo "文件存在" else echo "文件不存在" fi
循环结构
- for循环:遍历列表或文件名通配符
# 遍历列表 for i in 1 2 3; do echo "Item: $i" done
遍历当前目录.sh文件
for script in *.sh; do
echo “处理脚本: $script”
done
- **while循环**:条件为真时重复执行
```bash
count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
((count++)) # 自增(等同于count=$((count+1)))
done
- case语句:多分支选择
read -p "输入(yes/no): " choice case $choice in yes|y) echo "确认执行" ;; no|n) echo "取消执行" ;; *) echo "无效输入" ;; esac
函数与模块化
函数将重复逻辑封装,提高代码复用性,定义格式为函数名() { 命令; }
,调用时直接写函数名:
# 定义函数 backup_file() { local src=$1 # local声明局部变量 local dst=$2 if [ -f "$src" ]; then cp "$src" "$dst" echo "备份完成: $src -> $dst" else echo "源文件不存在: $src" fi } # 调用函数(传入参数) backup_file "/etc/hosts" "/backup/hosts.bak"
注意:函数内用local
声明的变量仅在该函数内有效,避免全局污染。
执行权限与调试
赋予执行权限
脚本需可执行才能直接运行(如./script.sh
),通过chmod
设置权限:
chmod +x backup.sh # 添加执行权限(所有者可读写执行,组和其他用户可读执行) # 或精确设置:chmod 755 backup.sh
执行方式
- 通过Bash执行:
bash backup.sh
(无需执行权限,适合调试) - 通过路径执行:
./backup.sh
(需执行权限,且当前目录需在$PATH
中,或使用) - 通过source执行:
source backup.sh
(在当前Shell执行,脚本内变量会影响当前环境)
调试技巧
- 使用
bash -x script.sh
,显示每条命令的执行结果,帮助定位逻辑错误:$ bash -x test.sh
- echo “Hello”
Hello - [ -f “/etc/passwd” ]
- echo “文件存在”
文件存在
- 在脚本内用
set -x
开启调试模式,set +x
关闭:#!/bin/bash set -x # 从此处开始调试 echo "调试中..." set +x # 关闭调试 echo "调试结束"
实例:自动备份脚本
结合上述知识点,编写一个备份/var/log
目录下日志文件的脚本:
#!/bin/bash # 日志备份脚本:将/var/log下.log文件备份至/backup,保留最近3个备份 backup_dir="/backup" log_dir="/var/log" max_backups=3 # 创建备份目录 mkdir -p "$backup_dir" # 遍历.log文件并备份 for log_file in "$log_dir"/*.log; do [ -f "$log_file" ] || continue # 跳过不存在的文件 filename=$(basename "$log_file") # 获取文件名(不含路径) backup_file="$backup_dir/${filename}_$(date +%Y%m%d%H%M%S).bak" cp "$log_file" "$backup_file" echo "已备份: $log_file -> $backup_file" done # 清理旧备份(保留最近3个) cd "$backup_dir" || exit 1 ls -t *.bak | tail -n +$((max_backups + 1)) | xargs rm -f echo "备份完成,已清理旧备份"
相关问答FAQs
Q1:为什么脚本设置了chmod +x
后,执行./script.sh
仍提示“Permission denied”?
A:可能是因为文件所有者与当前用户不匹配,或者文件系统权限限制,可通过以下方式解决:
- 确认当前用户是文件所有者:
ls -l script.sh
,检查所有者是否为当前用户(若不是,用chown
修改,如chown $USER:$USER script.sh
)。 - 检查SELinux状态(若启用):
sestatus
,若为 enforcing 模式,可能需恢复上下文:restorecon -v script.sh
。
Q2:Shell脚本中单引号、双引号、反引号(“)有什么区别?
A:三者的核心区别在于变量展开和命令替换:
- 单引号(’):严格按原样输出,不展开变量、不执行命令替换。
echo '$name'
输出$name
,'$(date)'
输出$(date)
。 - 双引号(”):展开变量,但不执行命令替换(需用替代)。
echo "Hello, $name"
若name="Linux"
,输出Hello, Linux
;"$(date)"
会执行date
命令并输出结果。 - 反引号(“):命令替换,将命令的执行结果替换到当前位置(等同于,但更推荐,支持嵌套且不易混淆)。
echo
date`或
echo $(date)`均输出当前日期时间。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/29871.html