在Linux系统中,脚本文件是自动化任务的核心工具,通过编写脚本可以批量执行命令、简化重复操作,本文将详细介绍Linux下脚本文件的编写方法,从基础语法到高级技巧,帮助读者快速上手。
创建脚本文件
脚本文件本质是文本文件,需使用扩展名(如.sh
)标识,创建方式有两种:
-
使用文本编辑器:通过
vi
、nano
或gedit
等工具创建,vi my_script.sh
进入编辑界面后,按
i
进入插入模式,编写脚本内容,完成后按Esc
输入wq
保存退出。 -
使用
cat
命令:直接通过命令行编写,适合简单脚本:cat > my_script.sh << EOF #!/bin/bash echo "Hello, Linux!" EOF
脚本基础语法
首行(Shebang)
脚本首行必须指定解释器,以开头,系统据此选择执行环境。
#!/bin/bash
:使用Bash解释器(最常用,兼容性强)。#!/bin/sh
:使用Bourne Shell(轻量级,适合基础脚本)。#!/usr/bin/python3
:使用Python3解释器(需编写Python代码)。
注释
以开头的行被视为注释,用于说明脚本功能、逻辑或参数,不会被解释器执行。
# 这是一个备份脚本,用于复制指定目录到备份位置
变量
- 定义变量:无需声明类型,直接赋值,
name="Alice" age=25
- 引用变量:通过或引用,可避免变量名与后续字符混淆,
echo "Name: $name, Age: $age" echo "Hello, ${name}!" # 推荐使用${},如${name}_suffix
- 只读变量:使用
readonly
修饰,不可修改,readonly config_path="/etc/config"
- 特殊变量:系统内置变量,如
$0
(脚本名)、$1
(第一个参数)、(上一条命令状态,0表示成功)、(进程ID)。
流程控制
脚本需根据条件执行不同逻辑,常用流程控制如下(通过表格对比语法):
控制结构 | 语法示例 | 说明 |
---|---|---|
if条件 | if [ $age -ge 18 ]; then echo “Adult” else echo “Minor” fi |
-ge (大于等于)、-eq (等于)、-ne (不等于)等需注意空格 |
for循环 | for file in *.txt; do echo “Processing $file” done |
遍历文件列表或序列,如{1..5} 表示1到5 |
while循环 | count=0 while [ $count -lt 3 ]; do echo “Count: $count” ((count++)) done |
count++ 通过实现自增,-lt (小于) |
case分支 | case $1 in start) echo “Starting…” ;; stop) echo “Stopping…” ;; *) echo “Invalid option” ;; esac |
适合多条件匹配,表示默认分支 |
函数
将重复逻辑封装为函数,提高代码复用性:
# 定义函数 backup_dir() { local src=$1 # 局部变量,仅函数内有效 local dst=$2 cp -r "$src" "$dst" # 变量加双引号,避免空格问题 echo "Backup completed: $src to $dst" } # 调用函数 backup_dir "/home/user/docs" "/backup/docs"
执行脚本
- 添加执行权限:
chmod +x my_script.sh # 赋予可执行权限
- 运行脚本:
- 方式1:
./my_script.sh
(需有执行权限,表示当前目录) - 方式2:
bash my_script.sh
(无需执行权限,直接调用解释器) - 传递参数:
./my_script.sh arg1 arg2
,在脚本中通过$1
、$2
引用。
- 方式1:
调试与错误处理
- 调试模式:在脚本首行后添加
set -x
,会显示每条命令的执行过程:#!/bin/bash set -x name="Bob" echo "Hello, $name"
- 错误处理:
- 检查命令状态:
if [ $? -ne 0 ]; then echo "Error"; exit 1; fi
- 使用
trap
捕获信号(如Ctrl+C中断):trap 'echo "Script interrupted"; exit 2' INT
- 检查命令状态:
完整示例:备份脚本
#!/bin/bash # 备份指定目录到目标位置,记录日志 src_dir="/var/log" dst_dir="/backup/logs" log_file="/backup/backup.log" # 检查目标目录是否存在,不存在则创建 [ ! -d "$dst_dir" ] && mkdir -p "$dst_dir" # 执行备份并记录时间 echo "Backup started at $(date)" >> "$log_file" cp -r "$src_dir" "$dst_dir" 2>> "$log_file" # 错误信息重定向到日志 # 检查备份结果 if [ $? -eq 0 ]; then echo "Backup successful: $(date)" >> "$log_file" else echo "Backup failed: $(date)" >> "$log_file" exit 1 fi
FAQs
问题1:脚本执行时提示“Permission denied”,如何解决?
解答:这是因为脚本没有执行权限,使用chmod +x 脚本名.sh
添加可执行权限,
chmod +x my_script.sh
若仍报错,检查文件所有者是否为当前用户(chown $USER:$USER my_script.sh
)。
问题2:脚本中变量未生效或显示为空,可能的原因是什么?
解答:常见原因包括:
- 变量未定义:检查变量名拼写是否正确,例如
$name
误写为$nmae
。 - 引用方式错误:变量引用时忘记加,或未用引号包裹含空格的值(如
path="/home/my dir"
)。 - 作用域问题:在函数内修改全局变量时,若使用
local
修饰,则变量仅在函数内有效,需确认是否需要全局变量。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/24769.html