问题:
- shell脚本在多个目录,多层级目录下。
- 想使用一个新的shell脚本去调用并直接执行对应的脚本。
编写脚本 run_all_scripts.sh
情况1: 单层主目录
#!/bin/bash
# 遍历 project01 目录下的所有子目录
for dir in project01/*; do
# 检查是否为目录
if [ -d "$dir" ]; then
# 遍历该目录下的所有 .sh 文件
for script in "$dir"/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
echo "Executing $script"
# 执行脚本
bash "$script"
fi
done
fi
done
情况2: 多个主目录
#!/bin/bash
# 定义要遍历的顶级目录数组
directories=("project01" "project02")
# 遍历每个顶级目录
for top_dir in "${directories[@]}"; do
# 遍历顶级目录下的所有子目录
for dir in "$top_dir"/*; do
# 检查是否为目录
if [ -d "$dir" ]; then
# 遍历该目录下的所有 .sh 文件
for script in "$dir"/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
echo "Executing $script"
# 执行脚本
bash "$script"
fi
done
fi
done
done
情况3: 脚本位置不同
#!/bin/bash
# 遍历 project01 目录下的所有子目录
for dir in project01/*; do
# 检查是否为目录
if [ -d "$dir" ]; then
# 遍历该目录下的所有 .sh 文件
for script in "$dir"/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
echo "Executing $script"
# 执行脚本
bash "$script"
fi
done
fi
done
# 遍历 project02 目录下的所有 .sh 文件
for script in project02/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
echo "Executing $script"
# 执行脚本
bash "$script"
fi
done
情况4: 带参数执行指定脚本
注意: 参数名称在各脚本中需要统一
#!/bin/bash
BASH_PATH="/home/project"
# 日志文件
LOG_FILE="$BASH_PATH/execution.log"
# 定义记录日志的函数
log() {
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$timestamp] $1" >> $LOG_FILE
echo "[$timestamp] $1"
}
# 默认参数值
UPDATE_MODULE="${UPDATE_MODULE}"
log "当前更新模块: $UPDATE_MODULE"
# 如果传递了参数,则使用传递的参数
if [ "$#" -ge 1 ]; then
UPDATE_MODULE="$1"
fi
echo "$UPDATE_MODULE"
# 遍历 project01 目录下的所有 .sh 文件
for script in $BASH_PATH/project01/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
log "Executing $script with UPDATE_MODULE=$UPDATE_MODULE"
# 执行脚本并捕获输出和错误
output=$(bash "$script" "$UPDATE_MODULE" 2>&1)
echo "Output of $script: $output"
fi
done
调整带参数的情况
#!/bin/bash
set -e
BASH_PATH="/mnt/project"
# 日志文件
LOG_FILE="$BASH_PATH/project01_execution.log"
# 定义记录日志的函数
log() {
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$timestamp] $1" | tee -a $LOG_FILE
}
# 默认参数值
UPDATE_MODULE="${UPDATE_MODULE:-all}"
log "当前更新模块: $UPDATE_MODULE"
# 如果传递了参数,则使用传递的参数
if [ "$#" -ge 1 ]; then
UPDATE_MODULE="$1"
fi
echo "$UPDATE_MODULE"
# 遍历 project01目录下的所有 .sh 文件
for script in $BASH_PATH/project01/*.sh; do
# 检查是否为文件
if [ -f "$script" ]; then
log "Executing $script with UPDATE_MODULE=$UPDATE_MODULE"
# 实时打印脚本输出和错误
bash "$script" "$UPDATE_MODULE" 2>&1 | tee -a $LOG_FILE
fi
done
最后,授权并执行测试脚本
chmod +x run_all_scripts.sh
./run_all_scripts.sh