0

次の .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 コマンドから最後の 2 つの引数 (つまり、$9 と $10) を削除すると、正常に動作し、期待どおりの結果が得られます。

誰かがここで何が起こっているのか説明してもらえますか?

4

1 に答える 1

1

${10}ではなく で試してみてください$10kshマニュアルページには、次のように記載されていParameter expansionます。

2 桁以上の定位置パラメーターは、中括弧で囲む必要があります。

ただし、それを行うより良い方法は、配列全体を使用することです。

/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]

中かっこのない複数桁の定位置パラメーターは、末尾に数字の定数がある 1 桁のパラメーターとして扱われます。つまり、$10として扱われてい${1}0ます。を中括弧で囲む10と、正しい結果が得られます。

于 2013-08-26T12:03:11.610 に答える