在 bash 中将数组作为 java 程序的参数传递

问题描述 投票:0回答:1

我正在通过 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 bash shell parameter-passing
1个回答
0
投票
我不与

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 ...
    
© www.soinside.com 2019 - 2024. All rights reserved.