You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本遍历.enc文件解密时数组构建与语法报错排查

问题根因

你遇到的逻辑失效、语法报错问题原因非常明确:

  1. enc_files=($(ls *.enc)) 失效原因:该写法默认按**所有空白字符(空格、制表符、换行)**拆分内容生成数组,只要文件名包含空格,就会被拆成多个数组元素,逐文件遍历自然失效。另外解析ls输出本身就是Shell编写的禁忌,ls的输出格式会受环境变量、系统版本影响,稳定性极差。
  2. mapfile 行语法报错原因:mapfile(别名readarray)是Bash独有的内置命令,报错核心原因是执行脚本时用了sh test.sh调用,或者脚本开头shebang写的是#!/bin/sh,指向POSIX sh解释器,不支持进程替换< <()语法和mapfile命令,直接抛出语法错误。另外原脚本在mapfile赋值后又写了一遍错误的ls数组赋值,会直接覆盖mapfile生成的正确数组,就算mapfile跑通也无法正常工作。
  3. 原脚本额外隐患:用ls -A判断文件是否存在的逻辑不稳定,cut 按.切割取文件名的逻辑,遇到文件名中间带.的场景(比如report.2024.enc)会切错文件前缀。
修复方案

直接用Bash原生glob通配符生成文件数组,完全不需要调用ls,不存在解析问题,也兼容带任意合法字符(包括空格、特殊符号)的文件名,修复后完整脚本如下:

#!/bin/bash
# 定义固定路径变量,避免重复写路径出错
ENC_DIR="/sodaman/tempPrabhu/temp"
ARCHIVE_DIR="/empty/sodaman/tempPrabhu/blr_temp"
ENCRYPT_TOOL="/empty/extproc/hfencrypt_plus"
KEY_FILE="/empty/extproc/hfsymmetrickey.dat"

# 切到加密文件所在目录,避免相对路径匹配问题
cd "$ENC_DIR" || exit 1

# 直接用glob匹配所有.enc文件生成数组,不需要调用ls
shopt -s nullglob
enc_files=(*.enc)
shopt -u nullglob

# 判断数组长度,确认是否存在enc文件
if [ ${#enc_files[@]} -gt 0 ]; then
  echo "开始遍历加密文件执行解密"
  for m in "${enc_files[@]}"
  do
    # 原生参数扩展去掉.enc后缀,比cut靠谱,不会被文件名中间的.干扰
    d="${m%.enc}.dat"
    echo "当前处理文件: $m, 解密输出文件: $d"
    
    # 执行解密命令,所有参数加引号避免空格问题
    "$ENCRYPT_TOOL" "$m" "$d" Decrypt "$KEY_FILE" log.log infa91punv
    echo "已执行解密命令: $ENCRYPT_TOOL $m $d Decrypt $KEY_FILE log.log infa91punv"
    
    if [ -f "$d" ]; then
      mv "$m" "$ARCHIVE_DIR"
      echo "解密成功,原加密文件已移动到归档目录"
      echo "删除临时日志文件: log.log"
      rm -f log.log
    else
      echo "错误:文件 $m 解密未成功"
    fi
  done
else
  echo "目标路径下未找到.enc后缀加密文件,退出"
fi
修复点说明
  • 脚本开头指定#!/bin/bash,执行时直接用./test.sh跑,不要用sh test.sh调用,保证所有Bash特性可用
  • 完全移除所有ls相关的解析、判断逻辑,用Bash原生通配符生成数组,从根源避免文件名拆分、ls输出格式兼容问题
  • 删掉原脚本中覆盖mapfile结果的错误数组赋值行
  • 用Bash原生字符串截取${m%.enc}替换cut命令,正确处理文件名中带.的场景
  • 所有路径、变量引用都加双引号,兼容带空格、特殊字符的文件名
  • 增加nullglob选项配置,匹配不到.enc文件时数组为空,不会把*.enc本身当成数组元素处理

内容的提问来源于stack exchange,提问作者Prabhu U

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:45:58