本文目录导读:

- 使用分号 - 顺序执行
- 使用逻辑与
&&- 条件执行 - 使用逻辑或 - 条件执行
- 使用管道 - 传递输出
- 使用命令替换 或
- 使用大括号 - 命令分组
- 使用子shell - 在子shell中执行
- 组合使用的实际示例
- 实用组合模式
- 错误处理组合
- 最佳实践建议
在Shell脚本中实现组合命令有几种常见方式,我来详细介绍:
使用分号 - 顺序执行
无论前一个命令是否成功,都会继续执行下一个:
#!/bin/bash echo "第一个命令" ; echo "第二个命令" ; echo "第三个命令"
使用逻辑与 && - 条件执行
只有前一个命令成功(返回0),才执行下一个:
#!/bin/bash mkdir test && cd test && touch file.txt # 只有目录创建成功才会进入并创建文件
使用逻辑或 - 条件执行
前一个命令失败时才执行下一个:
#!/bin/bash
cd /tmp || {
echo "无法进入/tmp目录"
exit 1
}
使用管道 - 传递输出
将前一个命令的输出作为后一个命令的输入:
#!/bin/bash
# 查找文件并计数
ls -la | grep "\.txt$" | wc -l
# 复杂的管道组合
ps aux | grep "nginx" | awk '{print $2}' | head -5
使用命令替换 或
将命令输出作为参数:
#!/bin/bash
# 当前时间作为文件名
datetime=$(date +%Y%m%d_%H%M%S)
touch "backup_${datetime}.tar.gz"
# 嵌套命令替换
result=$(echo "当前日期: $(date)")
使用大括号 - 命令分组
在同一个shell中执行多个命令:
#!/bin/bash
# 在当前目录执行多个操作
{
echo "开始备份"
tar -czf backup.tar.gz /path/to/data
echo "备份完成"
} && echo "备份成功" || echo "备份失败"
使用子shell - 在子shell中执行
命令在子shell中执行,不影响当前环境:
#!/bin/bash # 在子shell中修改目录,不影响当前shell (cd /tmp && echo "当前在: $(pwd)") echo "现在在: $(pwd)" # 还是原来的目录 # 子shell中的变量不会影响父shell var=1 (var=2; echo "子shell: $var") echo "父shell: $var" # 输出1
组合使用的实际示例
#!/bin/bash
# 综合示例:备份系统配置文件
SYS_CONFIG="/etc"
BACKUP_DIR="/backup/$(date +%Y%m%d)"
# 创建备份目录并检查是否成功
{
mkdir -p "$BACKUP_DIR" && \
echo "备份目录创建成功" || \
{ echo "创建目录失败"; exit 1; }
}
# 执行备份并记录日志
{
tar -czf "${BACKUP_DIR}/etc_backup.tar.gz" "$SYS_CONFIG" && \
echo "备份完成" >> "${BACKUP_DIR}/backup.log"
} || {
echo "备份失败" >> "${BACKUP_DIR}/error.log"
exit 1
}
# 删除7天前的旧备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete 2>/dev/null && \
echo "清理旧备份完成" || echo "无需清理"
实用组合模式
#!/bin/bash
# 模式1:链式检查
[ -f "file.txt" ] && [ -r "file.txt" ] && echo "文件存在且可读"
# 模式2:三目运算效果
[ "$USER" = "root" ] && echo "管理员" || echo "普通用户"
# 模式3:并行执行(后台运行)
{
command1 &
command2 &
command3 &
wait # 等待所有后台任务完成
echo "所有命令执行完毕"
}
# 模式4:重定向组合
{
echo "错误信息" >&2
echo "正常输出"
} > output.log 2>&1
错误处理组合
#!/bin/bash
set -e # 遇到错误立即退出
# 组合命令的错误处理
execute_with_retry() {
local cmd="$1"
local max_attempts=3
local attempt=1
while [ $attempt -le $max_attempts ]; do
if eval "$cmd" 2>/dev/null; then
echo "命令执行成功"
return 0
else
echo "第${attempt}次尝试失败"
((attempt++))
[ $attempt -le $max_attempts ] && sleep 2
fi
done
return 1
}
# 使用示例
execute_with_retry "curl -s http://example.com" && \
echo "网站可访问" || echo "网站不可访问"
最佳实践建议
- 合理使用逻辑运算符:
&&和 比 更安全 - 避免过于复杂的单行命令:可读性很重要
- 使用子shell隔离环境变量: 防止变量污染
- 注意退出状态:使用 或
set -e管理错误 - 适当使用注释:复杂组合命令需要文档说明
这些组合方式可以灵活运用,满足各种脚本需求。