Bash脚本报错排查:检查文件名是否含末尾时间戳并移动文件
解决bash脚本中
[: missing ]错误的问题 嘿,这个错误其实是bash里常见的语法小坑,咱们一步步拆解解决:
直接触发错误的原因
你的if条件里,[是test命令的别名,它对空格的要求特别严格——在]的前面必须加一个空格!
看你原来的代码:
if [ -f ${PRODUCT_HOME}/file.*.zip]; then
这里的];是连在一起的,bash会把file.*.zip];当成一个整体参数,找不到对应的闭合],所以直接抛出[: missing ]的错误。
只要调整成下面这样,就能修复这个语法问题:
if [ -f ${PRODUCT_HOME}/file.*.zip ]; then
注意file.*.zip和]之间的空格!
隐藏的另一个核心问题
不过还有个容易忽略的隐患:-f选项是用来检查单个文件是否存在且为普通文件的,但file.*.zip是通配符,如果匹配到多个文件(比如同时有file.20240520.zip和file.20240521.zip),[ -f ]会因为参数过多直接报错,这也是你后续可能遇到的问题。
修正后的完整脚本
我帮你调整了逻辑,既能处理单个/多个带时间戳的文件,也能避免各种报错:
while read product; do # 用数组存储所有匹配带时间戳的文件 timestamp_files=("${PRODUCT_HOME}/file.*.zip") # 检查是否真的存在匹配的文件(避免通配符本身不匹配时的情况) if [ -f "${timestamp_files[0]}" ]; then echo "Found files with timestamp." # 循环处理每个匹配的文件,保留原文件名避免覆盖 for file in "${PRODUCT_HOME}/file.*.zip"; do mv "$file" "/home/has_time_stamp/$(basename "$file")" done else echo "No timestamped files found." # 先检查目标文件是否存在,再执行移动 if [ -f "${PRODUCT_HOME}/file.zip" ]; then mv "${PRODUCT_HOME}/file.zip" "/home/no_time_stamp/file.zip" else echo "Error: file.zip not found in ${PRODUCT_HOME}!" fi fi done <product_details.txt
几个关键优化点:
- 用数组存储通配符结果,准确判断是否有匹配的文件
- 循环处理多个带时间戳的文件,移动时保留原文件名(避免多个文件覆盖成同一个
file.zip) - 添加了
file.zip的存在性检查,防止mv命令因为找不到文件而报错
内容的提问来源于stack exchange,提问作者Vimbuddy
相关产品推荐
相关产品推荐

