当我尝试执行以下 .ksh 文件时,参数没有按预期传递。
ProcessLauncher.ksh:
/usr/java/jdk1.7.0_25/bin/java -Xmx256M $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
这是我执行以调用上述 .ksh 文件的代码:
调用类:
public static void main(String[] args) {
String[] cmdline = {};
cmdline = new String[]{"ksh", "../scripts/ProcessLauncher.ksh", com.myPackage.CalledClass.class.getName(), "SimpleDF", "1099"};
}
这是调用 .ksh 文件后执行的代码:
调用类:
public static void main(String[] args) {
System.out.println("Arguments passed: " + Arrays.toString(args));
if (args.length != 2) {
System.out.println("Invalid arguments");
System.exit(0);
}
}
执行 CallingClass#main() 方法后的预期结果:
Arguments passed: SimpleDF 1099
执行CallingClass#main()方法后的实际结果:
Arguments passed: SimpleDF 1099 com.myPackage.calledClass
Invalid arguments
完全限定的类名被错误地作为最后一个参数传递。我在 SuSE Linux Enterprise Server(32 位)上使用 JDK7u25(32 位)。但是,当我从 .ksh 文件中的 java 命令中删除最后两个参数(即 $9 和 $10)时,它工作正常并且我得到了预期的结果。
有人可以解释一下这是怎么回事吗?
最佳答案
尝试使用 ${10}
而不是 $10
。 ksh
手册页在 Parameter expansion
下指出:
A positional parameter of more than one digit must be enclosed in braces.
但是,更好的方法可能是使用整个数组:
/usr/java/jdk1.7.0_25/bin/java -Xmx256M "$@"
您实际上可以在以下抄本中看到问题所在:
pax> cat tst.ksh
#!/usr/bin/ksh
echo " 1 = [$1]"
echo " 2 = [$2]"
echo " :"
echo " 9 = [$9]"
echo "10a = [$10]"
echo "11a = [$11]"
echo "10b = [${10}]"
echo "11b = [${11}]"
pax> tst.ksh a b c d e f g h i j k
1 = [a]
2 = [b]
:
9 = [i]
10a = [a0]
11a = [a1]
10b = [j]
11b = [k]
不带大括号的多位位置参数被视为带有尾随数字常量的一位数。换句话说,$10
被视为 ${1}0
。当您用大括号将 10
括起来时,将获得正确的结果。
关于java - 错误的参数传递给 .ksh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18443434/