Bash数组处理含/无空格文件名脚本报错问题求助
问题根源分析
你遇到的错误核心原因是数组遍历方式错误:
- 你用了
for i in ${files[*]},这会把数组所有元素展开成空格分隔的字符串,遍历的是文件名本身而非数组索引。 - 后续用
${files[$i]}时,相当于把文件名(比如snmp.conf)当作数组索引来使用,而数组索引必须是整数,bash会尝试把snmp.conf当作算术表达式解析,自然会报syntax error: invalid arithmetic operator的错误。
另外还有一个隐藏问题:你把命令变量sepscan和存储扫描结果的变量重名了,第一次循环后sepscan会被覆盖成数字,后续循环执行扫描命令时会彻底失效。
修复方案
针对这些问题,我们一步步修正脚本:
1. 正确遍历数组元素(推荐方式)
直接遍历数组的每个元素,不需要通过索引,这样更直观且避免索引错误:
for file in "${files[@]}" do # 后续直接用 "$file" 代替 "${files[$i]}" done
2. 避免变量名冲突
把存储扫描结果的变量和命令变量分开,比如将结果变量命名为scan_output_length。
3. 其他细节优化
- 所有路径和文件名引用都加上双引号,避免空格/特殊字符导致的拆分
fuser加上-s参数进入静默模式,减少不必要的输出- 用
$(date)代替反引号,可读性更好 mv命令的目标路径也加上双引号,防止路径含空格
修正后的完整脚本
#!/bin/bash set -x workingpath='/mnt/Incoming/ToScan/' outputpath='/mnt/Incoming/Scanned/' logfile='/var/log/howscan.log' faildir='/mnt/Incoming/ScanFailed/' # 命令变量单独定义,避免被覆盖 scan_cmd='/opt/Symantec/symantec_antivirus/sav manualscan -c' # 切换工作目录时加引号,防止路径含空格,切换失败则退出脚本 cd "$workingpath" || exit 1 shopt -s extglob nullglob while true do # 排除.aspx文件,生成文件数组 files=( !(*.aspx) ) if [ ${#files[@]} -ne 0 ]; then # 直接遍历数组元素,处理所有含空格/特殊字符的文件名 for file in "${files[@]}" do # 检查文件是否被占用,-s静默模式,重定向错误输出避免干扰 fileopen=$(fuser -s "$file" 2>/dev/null; echo $?) # fuser返回0表示文件被占用,非0表示未被占用,调整判断逻辑更准确 if [ $fileopen -eq 0 ]; then echo "$(date) $file is being used so has been ignored" >> "$logfile" else echo "$(date) File $file not being used or accessed" >> "$logfile" # 执行扫描命令,捕获输出长度 scan_output_length=$($scan_cmd "$file" | wc -c) if [ $scan_output_length -eq 0 ]; then mv "$file" "$outputpath" echo "$(date) $file has been virus scanned and moved to $outputpath" >> "$logfile" else mv "$file" "$faildir" echo "$(date) $file has been moved to $faildir as a virus or error was detected" >> "$logfile" fi fi done fi echo "$(date) No more files to process. Waiting 60 seconds..." >> "$logfile" sleep 60 done
关键修改点说明
- 数组遍历改为
for file in "${files[@]}",确保每个文件名(包括含空格/特殊字符的)被当作单独的元素处理 - 命令变量
scan_cmd与结果变量scan_output_length分离,避免覆盖 - 调整
fuser的判断逻辑:fuser -s静默执行,返回值0表示文件被占用,更符合工具的返回规范 - 所有涉及路径和文件名的地方都加了双引号,彻底解决空格/特殊字符的兼容性问题
内容的提问来源于stack exchange,提问作者Huckleberry Finn
相关产品推荐
相关产品推荐

