Bash脚本需求:执行不在排除列表中的脚本及代码求助
我来帮你完善这个功能,下面是完整的Bash函数实现,能满足你“执行未被排除的脚本”的需求:
完整函数代码
exclude_process() { # 定义两个列表文件的路径,请根据你的实际目录调整${INC}变量 local ALL_SCRIPTS="${INC}/list_all_process.ini" local EXCLUDE_SCRIPTS="${INC}/exclude_proccess.ini" # 先检查全量脚本列表是否存在,不存在直接报错退出 if [[ ! -f "$ALL_SCRIPTS" ]]; then echo "Error: 全量脚本列表文件 $ALL_SCRIPTS 不存在" >&2 return 1 fi # 处理排除列表不存在的情况:给出警告并执行所有脚本 if [[ ! -f "$EXCLUDE_SCRIPTS" ]]; then echo "Warning: 排除列表文件 $EXCLUDE_SCRIPTS 不存在,将执行所有脚本" >&2 while IFS= read -r script; do # 跳过空行,只执行存在且可执行的脚本 [[ -n "$script" && -f "$script" && -x "$script" ]] && ./"$script" done < "$ALL_SCRIPTS" return 0 fi # 将排除列表存入关联数组(哈希表),实现O(1)时间复杂度的存在性检查 declare -A exclude_map while IFS= read -r excluded_script; do # 跳过空行,避免无效键 [[ -n "$excluded_script" ]] && exclude_map["$excluded_script"]=1 done < "$EXCLUDE_SCRIPTS" # 遍历全量脚本列表,执行未被排除的脚本 while IFS= read -r target_script; do # 跳过空行 [[ -z "$target_script" ]] && continue # 判断脚本是否在排除列表中 if [[ -n "${exclude_map["$target_script"]}" ]]; then echo "跳过排除脚本: $target_script" continue fi # 检查脚本是否存在且可执行,避免执行无效文件 if [[ -f "$target_script" && -x "$target_script" ]]; then echo "开始执行脚本: $target_script" ./"$target_script" # 可选:如果需要在脚本执行失败时终止函数,取消下面的注释 # if [[ $? -ne 0 ]]; then # echo "Error: 脚本 $target_script 执行失败" >&2 # return 1 # fi else echo "Warning: 脚本 $target_script 不存在或无执行权限" >&2 fi done < "$ALL_SCRIPTS" }
代码详细解释
- 路径定义:用
local关键字定义函数内的文件路径变量,避免污染全局环境,同时方便后续修改路径。 - 文件存在性校验:
- 全量列表不存在时直接报错退出,避免后续无意义的执行。
- 排除列表不存在时给出警告,默认执行所有脚本,提升鲁棒性。
- 关联数组优化查找:把排除的脚本名存入关联数组,相比每次遍历排除数组,这种方式的存在性检查效率更高,尤其当排除列表很长时。
- 遍历执行逻辑:
- 跳过空行,避免处理无效内容。
- 先判断脚本是否在排除列表,是则跳过;否则检查脚本的存在性和可执行权限,确保执行的是有效脚本。
- 可选的错误处理:如果需要在单个脚本执行失败时终止整个函数,可以取消注释错误检查的代码块。
额外注意事项
- 如果脚本不在当前工作目录,请确保
list_all_process.ini中存储的是完整路径,或者在函数开头添加cd /path/to/scripts切换到脚本所在目录。 - 如果列表文件中有注释行(以
#开头),可以在读取时添加判断跳过:[[ "$target_script" =~ ^# ]] && continue。 - 若需要并行执行脚本,可以把
./"$target_script"改成./"$target_script" &,但要注意服务器资源占用情况。
内容的提问来源于stack exchange,提问作者pomme
相关产品推荐
相关产品推荐

