如何通过Bash脚本收集所有用户crontab中的Shell脚本至列表
汇总所有用户crontab中的Shell脚本到数组
你的现有代码完成了提取单个用户crontab脚本的基础步骤,但还需要把提取结果正确加入all_scripts数组,同时处理边缘情况(比如用户无crontab、脚本路径含空格等)。以下是修正后的完整实现:
all_scripts=() for user in "${OS_USER[@]}"; do # 跳过无法获取crontab的用户(比如无定时任务的用户) crontab_content=$(crontab -u "$user" -l 2>/dev/null) || continue # 提取所有.sh结尾的脚本路径,遍历添加到数组 while IFS= read -r script; do all_scripts+=("$script") done < <(echo "$crontab_content" | awk '{for(i=1;i<=NF;i++) if($i ~ /\.sh$/) print $i}' | sort -u) done # 对最终数组全局去重(若不同用户有重复脚本) all_scripts=($(printf "%s\n" "${all_scripts[@]}" | sort -u))
关键改进点:
- 错误处理:用
2>/dev/null屏蔽crontab -l的错误输出,搭配|| continue跳过无crontab的用户,避免脚本中断。 - 可靠提取:改用
awk遍历crontab的每个字段,精准匹配.sh结尾的脚本,比多层grep更稳定,能适配多数路径格式。 - 数组安全添加:通过
while read循环逐个将脚本路径加入数组,避免因路径含空格导致的字符串拆分问题。 - 全局去重:最后对整个数组做去重处理,确保最终列表无重复脚本。
比如你给出的示例场景:
- 用户1的crontab含
script1.sh、script2.sh - 用户2含
script3.sh、script4.sh、script5.sh - 用户3含
script6.sh
运行脚本后,all_scripts数组会包含所有这6个脚本路径,且无重复。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

