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

Bash脚本向Java程序传递数组参数时遇非法字符异常的解决方法

问题:Bash脚本传递含空格的文件路径给Java程序报错

原脚本代码:

lastLine=$(cat $info_file | wc -l)

countID=0

cat $info_file | while read fileID; do

initVar="${initVar} ${fileID}.txt"

countID=$(($countID + 1))

if [ "$countID" == "$lastLine" ]; then
echo $initVar > tmp_${SampleID}.txt
fi

done

InputListVar=$(cat tmp_${SampleID}.txt)

java ProgramX --input "${InputListVar[@]}" --output $output_file

运行时报错:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal character in path at index 15 

问题原因

你推测的没错,核心问题是用字符串拼接存储文件路径,未正确处理含空格的路径:
原脚本把所有路径拼进单个字符串initVar,写入临时文件再读取后,bash会自动将字符串中的空格当作参数分隔符,导致含空格的路径被拆分成多个不完整的参数传给Java程序,Java解析时自然会判定路径存在非法字符(实际是路径被截断)。

解决方法

改用Bash数组存储文件路径,数组能保留每个元素的完整内容(包括空格),无需临时文件,直接传递给Java程序:

修改后的脚本:

# 初始化空数组
initVar=()

# 循环读取文件ID,填充数组
while read -r fileID; do
    initVar+=("$fileID.txt")
done < "$info_file"

# 正确传递数组参数给Java程序
java ProgramX --input "${initVar[@]}" --output "$output_file"

关键修改点

  • 用initVar=()初始化空数组,替代字符串拼接逻辑
  • 循环中用initVar+=("$fileID.txt")添加元素,双引号确保含空格的路径被当作单个完整元素
  • 直接从$info_file读取内容(避免管道导致的子shell问题),read -r参数保留原始字符(包括反斜杠)
  • 传递参数时用"${initVar[@]}",bash会将数组的每个元素作为单独参数传递,完美保留含空格的路径

内容的提问来源于stack exchange,提问作者CaffèSospeso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:38:08