Bash脚本将变量作为Java入参及文件生成路径异常问题排查
问题1解决:Java参数为空抛出数组越界
- 根本原因是bash变量赋值语法错误:你最初的脚本里
BDPATH= realpath ./BD写法不符合bash变量赋值规则,等号两侧不能有空格,该写法实际语义是临时将BDPATH设为空值,再单独执行realpath命令,没有捕获realpath的输出存入变量,所以BDPATH实际是空值,传入Java时自然没有参数触发越界。 - 正确的变量赋值写法如下,引用变量时建议用双引号包裹,避免路径包含空格等特殊字符时被拆分为多个参数:
BDPATH=$(realpath ./BD) echo "$BDPATH" javac -d ./CODE/bin ./CODE/src/bdd/*.java && java -cp ./CODE/bin/ bdd.Main "$BDPATH"
问题2解决:文件生成位置不符合预期
- 根本原因是Java代码内的文件路径逻辑问题:从调试输出可以确认BD的绝对路径已经正确传入Java程序,此时文件生成在脚本所在目录的
DB/f1.df,说明你的Java代码中创建文件时使用的是相对路径,相对路径的基准是Java进程的工作目录,也就是你执行脚本的目录(脚本所在目录),和你传入的BD路径没有关联。 - 两种解决方法可选:
- 修改Java代码,拼接路径时以传入的BD路径作为父目录,示例写法:
// args[0]就是你传入的BD绝对路径 File f1 = new File(args[0], "f1.df");- 不想修改代码的话可以在bash脚本中执行Java命令前先切换到BD目录,修改脚本如下:
#!/bin/bash BDPATH=$(realpath ./BD) javac -d ./CODE/bin ./CODE/src/bdd/*.java && cd "$BDPATH" && java -cp "$OLDPWD/CODE/bin/" bdd.Main "$BDPATH"
内容的提问来源于stack exchange,提问作者Misubata
相关产品推荐
相关产品推荐

