2013-08-26 54 views
0

當我嘗試執行以下.ksh文件時,參數未按預期傳遞。錯誤參數傳遞給.ksh

ProcessLauncher.ksh:

/usr/java/jdk1.7.0_25/bin/java -Xmx256M $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 

這是我執行調用上述.ksh文件中的代碼:

CallingClass:

public static void main(String[] args) { 
    String[] cmdline = {}; 
    cmdline = new String[]{"ksh", "../scripts/ProcessLauncher.ksh", com.myPackage.CalledClass.class.getName(), "SimpleDF", "1099"}; 
} 

這是調用.ksh文件後執行的代碼:

CalledClass:

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)中移除最後兩個參數時,它工作正常,我得到了預期的結果。

有人能解釋一下這裏發生了什麼嗎?

+0

Potenstiu問題的一部分,但你的ksh腳本應該使用'「$ @」'而不是'$ 1 $ 2 $ 3 ....'(注意雙引號包含在腳本中) – rolfl

回答

1

試試${10}而不是$10Parameter expansionksh手冊頁指出:

多個數字的位置參數必須用括號括起來。

然而,更好的方法來做到這一點可能是使用整個數組:

/usr/java/jdk1.7.0_25/bin/java -Xmx256M "[email protected]" 

實際上,你可以看到什麼錯在下面的成績單:

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時,會獲得正確的結果。

+0

哇! 。它像一個魅力。謝謝您的幫助。 – ParagJ