基础命令执行方式
-
直接执行命令
在脚本中直接写入命令,按顺序执行:#!/bin/bash echo "开始执行任务" date # 输出当前日期 ls -l /tmp # 列出/tmp目录内容
每行一条命令,从上到下顺序执行。
-
通过变量执行
将命令存储在变量中,用或反引号调用:#!/bin/bash current_time=$(date "+%Y-%m-%d %H:%M") # 捕获命令输出 echo "当前时间: $current_time" # 动态命令示例 cmd="uname -r" kernel_version=$($cmd) # 执行变量中的命令 echo "内核版本: $kernel_version"
处理命令执行结果
-
获取退出状态码
通过检查命令是否成功(0表示成功):grep "error" /var/log/syslog if [ $? -eq 0 ]; then echo "发现错误日志" else echo "无错误日志" fi
-
捕获命令输出
使用或反引号将输出存入变量:disk_usage=$(df -h | grep '/dev/sda1') echo "磁盘使用情况: $disk_usage"
高级执行技巧
-
条件执行
用&&
(成功时执行)和(失败时执行)连接命令:mkdir /backup && cp -r /data /backup # 目录创建成功才复制 ping -c1 google.com || echo "网络不可达" # 失败时输出警告
-
循环执行命令
批量处理文件或重复操作:# 遍历当前目录的.txt文件 for file in *.txt; do echo "处理文件: $file" wc -l "$file" # 统计行数 done # 条件循环示例 while ping -c1 server.example.com &>/dev/null; do echo "服务器在线,等待5秒..." sleep 5 done
-
后台执行
添加&
让命令在后台运行:# 同时压缩两个目录 tar -czf backup1.tar.gz /data1 & tar -czf backup2.tar.gz /data2 & wait # 等待所有后台任务完成 echo "压缩完成"
安全性与错误处理
-
严格模式
在脚本开头启用安全检测:#!/bin/bash set -e # 任何命令失败时立即退出 set -u # 使用未定义变量时报错 set -o pipefail # 管道中任意命令失败则整体失败
-
输入验证
防止用户输入导致意外操作:read -p "输入目录名: " dir if [ ! -d "$dir" ]; then echo "错误:目录不存在" >&2 exit 1 fi rm -rf "$dir"/* # 仅当目录存在时删除内容
-
错误日志
重定向错误输出到文件:# 将标准输出和错误输出分离记录 apt update > update.log 2> error.log
常见问题与解决
- 权限问题:
用chmod +x script.sh
添加执行权限。 - 路径错误:
使用绝对路径(如/usr/bin/grep
)或开头声明PATH=/bin:/usr/bin
。 - 特殊字符冲突:
用引号包裹变量(例如rm "$file"
避免文件名含空格时报错)。 - 命令未找到:
在脚本开头指定解释器路径(#!/bin/bash
)。
最佳实践总结
- 清晰注释:关键步骤添加说明(如
# 备份数据库
)。 - 模块化设计:复杂操作拆分为函数:
backup_data() { tar -czf "backup-$(date +%F).tar.gz" "$1" } backup_data /home/user
- 测试验证:在安全环境测试脚本(如用
bash -n script.sh
检查语法)。 - 日志记录:关键操作输出到日志文件(
>> script.log 2>&1
)。
权威引用:
- Bash官方文档:GNU Bash手册
- Linux命令行标准:IEEE Std 1003.1
- 安全编程指南:Linux安全加固手册
通过掌握这些方法,您将能编写出高效、健壮的Bash脚本,轻松应对自动化任务,遇到复杂场景时,优先查阅官方文档确保解决方案的准确性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9810.html