我正在通过 bash 脚本运行 Java 程序。 我的计划是迭代 for 循环来创建要传递的参数:
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
我认为这是由于我在
InputListVar
数组中提供的文件列表中存在空间(如此处建议的 索引 16 处路径中的非法字符)。我该如何解决这个问题?
java
合作,但我假设
java
希望看到类似的内容:
java --input file1 file2 file3 --output ...
OP 的脚本应该生成这种格式 IF InputListVar
被定义为数组,但事实并非如此。以下创建一个标量变量:
InputListVar=$(cat tmp_${SampleID}.txt)
如果我们假设输入文件的内容如下:
$ cat tmp_${SampleID}.txt
file1
file2
file3
然后我们得到以下结果:
$ InputListVar=$(cat tmp_${SampleID}.txt)
$ typeset -p InputListVar
declare -- InputListVar=$'file1\nfile2\nfile3'
因此,当将其输入到java
时,会发生以下情况:
java --input "${InputListVar[@]}" --output ...
# becomes
java -- input file1
file2
file3 -- ouput ...
# hence an error
注意: ${InputListVar}
在技术上与
${InputListVar[0]}
相同,因此
${InputListVar[@]}
变为
${InputListVar[0]}" which becomes
${InputList}`我们可以通过确保我们正在使用数组来“解决”问题:
InputListVar=( $(cat tmp_${SampleID}.txt) ) # note the additional pair of outer parens
返回java
通话:
java --input "${InputListVar[@]}" --output ...
# becomes
java -- input file1 file2 file3 -- ouput ...