Bash脚本遍历JSON文件判断内容为空问题排查
Bash脚本遍历JSON文件并判断内容为空的错误排查与修复
问题场景
需求是遍历/inputs/resource/*/路径下的所有JSON文件,逐个判断文件内容是否为空,但现有脚本运行时未逐个遍历文件,且误判有内容的文件为空,终端输出所有文件名后直接提示“JSON file is empty.”并退出。
原脚本代码:
#!/bin/bash file_json=$(find /inputs/resource/*/*.json | awk -F'/' '{ print $(NF) }' | sort -n) echo "Checking JSON file content." for file in "$file_json"; do echo "$file" if [[ ! -s "file" ]]; then echo "JSON file is empty." exit fi echo "JSON file is not empty." done
终端输出:
Checking JSON file content. xpm1.json xpm2.json xpm3.json JSON file is empty.
错误分析
未逐个遍历文件:
file_json=$(find ...)将所有文件名拼接成单个字符串,for file in "$file_json"会把整个字符串当作一个循环项,导致一次输出所有文件名,而非逐个处理。- 用
awk提取文件名时丢失了文件的完整路径,后续判断时无法定位到实际文件。
误判文件为空并提前退出:
[[ ! -s "file" ]]中的file是固定字符串,而非变量引用,正确写法应为[[ ! -s "$file" ]]。- 由于丢失了文件路径,脚本会在当前目录查找名为
file的文件(不存在),所以-s判断始终为真,触发错误提示。 exit会直接终止脚本,导致后续文件未被检查。
修复后的脚本
#!/bin/bash # 直接用glob匹配目标路径下的JSON文件,排序后逐个遍历 files=(/inputs/resource/*/*.json) IFS=$'\n' sorted_files=($(sort -n <<<"${files[*]}")) unset IFS echo "开始检查JSON文件内容" for file in "${sorted_files[@]}"; do echo "当前检查: $file" if [[ ! -s "$file" ]]; then echo "$file 内容为空" # exit 1 # 按需决定是否在发现空文件时终止脚本 else echo "$file 内容不为空" fi done
修复说明
- 保留文件的完整路径,确保
-s能正确判断目标文件的内容是否为空。 - 用正确的变量引用
"$file"替代字符串file。 - 采用数组存储文件路径并排序,实现逐个遍历处理。
- 可根据需求选择是否保留
exit,决定是否在发现空文件时终止脚本。
内容的提问来源于stack exchange,提问作者生きがい
相关产品推荐
相关产品推荐

