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
相关产品推荐
相关产品推荐

