【问题标题】:wrong arguments are passed to .ksh错误的参数被传递给 .ksh
【发布时间】:2023-11-17 13:47:01
【问题描述】:

当我尝试执行以下 .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() 方法后的预期结果:

通过的参数:SimpleDF 1099

执行CallingClass#main()方法后的实际结果:

通过的参数:SimpleDF 1099 com.myPackage.calledClass

无效参数

完全限定的类名作为最后一个参数被错误地传递。我在 SuSE Linux Enterprise Server(32 位)上使用 JDK7u25(32 位)。但是,当我从 .ksh 文件中的 java 命令中删除最后两个参数(即 $9 和 $10)时,它工作正常,我得到了预期的结果。

有人可以解释一下这里发生了什么吗?

【问题讨论】:

  • 可能是问题的一部分,但您的 ksh 脚本应该使用 "$@" 而不是 $1 $2 $3 ....(请注意脚本中要包含双引号)

标签: java linux ksh


【解决方案1】:

试试${10} 而不是$10ksh 手册页在 Parameter expansion 下声明:

多于一位的位置参数必须用大括号括起来。

但是,更好的方法可能是使用整个数组:

/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 用大括号括起来时,将获得正确的结果。

【讨论】: