UNIX Shell脚本中基于gsutil提取日期的比较逻辑失效求助
问题描述
尝试从gsutil ls -l命令输出中提取文件日期,与指定日期范围(2024-05-01至2025-07-09)比较后执行文件复制逻辑。但实际运行时,即使文件日期(2024-10-11)处于范围内,仍提示“跳过该文件,因日期超出范围”,未执行复制操作。
使用的脚本代码:
lstr=$(gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml) prcs_date=$(echo ${lstr} | awk '{print $2}' | awk -F"T" '{print $1}') date_frmt=$(date -d "$prcs_date" +"%Y-%m-%d") cmpr_date=$(date -d "2024-05-01" +"%Y-%m-%d") high_date=$(date -d "2025-07-09" +"%Y-%m-%d") if [[ "${date_frmt}" -ge "${cmpr_date}" && "${date_frmt}" -lt "${high_date}" ]] then fname=$(echo "$lstr" | awk '{print $3}') gsutil cp "${fname}" gs://output-dev/ if [ $? -eq 0 ] then echo "1 File Successfully Copied to Target Location" else echo "Error in copying file - ${fname}" fi else echo "Skipping File ${fname} as it falls outside date range" fi
gsutil ls -l命令输出:
$ gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml 13461 2024-10-11T07:45:15Z gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml TOTAL: 1 objects, 13461 bytes (13.35 KiB)
问题排查与修复
核心问题1:错误使用数值比较运算符
[[ ]]中-ge/-lt是数值比较运算符,但YYYY-MM-DD格式的日期是字符串。虽然该格式按字典序可正确比较,但用数值运算符会将日期字符串当作数字解析,导致比较逻辑完全错误。
核心问题2:fname变量未提前定义
fname仅在if分支内赋值,进入else分支时变量未定义,输出提示会出现空值,同时也会干扰对问题原因的判断。
额外问题:gsutil ls -l输出包含总行
原脚本直接读取命令的全部输出,合并后可能导致字段提取异常(多文件场景下问题更明显),需过滤掉TOTAL开头的汇总行。
修复后的脚本
# 过滤TOTAL汇总行,仅保留文件信息行 lstr=$(gsutil ls -l gs://input-bucket/my_file_PAS_EXTRACT_INBOUND.xml | grep -v "^TOTAL") # 一行awk完成日期提取,减少管道操作 prcs_date=$(echo "${lstr}" | awk -F"[T ]" '{print $2}') # YYYY-MM-DD格式可直接字符串比较,无需date转换 date_frmt="${prcs_date}" cmpr_date="2024-05-01" high_date="2025-07-09" # 提前定义fname变量,避免else分支空值 fname=$(echo "${lstr}" | awk '{print $3}') # 使用字符串比较运算符 if [[ "${date_frmt}" >= "${cmpr_date}" && "${date_frmt}" < "${high_date}" ]] then gsutil cp "${fname}" gs://output-dev/ if [ $? -eq 0 ] then echo "1 File Successfully Copied to Target Location" else echo "Error in copying file - ${fname}" fi else echo "Skipping File ${fname} as it falls outside date range" fi
关键优化说明
- 用
grep -v "^TOTAL"过滤汇总行,确保仅处理有效文件信息。 - 合并
awk命令,通过-F"[T ]"同时按空格和T分割,直接提取日期部分,简化流程。 - 利用
YYYY-MM-DD格式的字典序特性,直接字符串比较,省去date转换步骤。 - 提前定义
fname变量,避免分支内未赋值导致的空值问题。 - 将数值比较运算符替换为字符串比较运算符
>=/<,确保日期判断逻辑正确。
内容的提问来源于stack exchange,提问作者marie20
相关产品推荐
相关产品推荐

