Java程序調用帶參數的shell腳本返回值
首先來看看linux中shell變量(\(#,\)@,$0,$1,$2)的含義解釋
變量說明:
- $$
Shell本身的PID(ProcessID) - $!
Shell最后運行的后台Process的PID - $?
最后運行的命令的結束代碼(返回值) - $-
使用Set命令設定的Flag一覽 - \(* 所有參數列表。如"\)*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
- \(@ 所有參數列表。如"\)@"用「"」括起來的情況、以"$1" "\(2" … "\)n" 的形式輸出所有參數。
- $#
添加到Shell的參數個數 $0 Shell本身的文件名 \(1~\)n 添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
Java程序調用帶參數的shell腳本返回值實現具體代碼
package com.javen.kit;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;
public class ShellKit {
/**
* 運行shell腳本
* @param shell 需要運行的shell腳本
*/
public static void execShell(String shell) {
try {
Runtime rt = Runtime.getRuntime();
rt.exec(shell);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 運行shell
*
* @param shStr
* 需要執行的shell
* @return
* @throws IOException
* 注:如果sh中含有awk,一定要按new String[]{"/bin/sh","-c",shStr}寫,才可以獲得流.
*/
public static List<String> runShell(String shStr) throws Exception {
List<String> strList = new ArrayList<String>();
Process process;
process = Runtime.getRuntime().exec(new String[] {"/bin/sh","-c",shStr},null,null);
InputStreamReader ir = new InputStreamReader(process
.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
process.waitFor();
while ((line = input.readLine()) != null) {
strList.add(line);
}
return strList;
}
}
例子
假設有一個shell腳本文件test.sh,有兩個參數parm1,parm2,java調用的方法如下:
String[] cmd = {"/bin/sh","-c","test.sh parm1 parm2"};
Runtime.getRuntime().exec(cmd);
上面的ShellKit.java
就是對該方法的封裝
test.sh
#!/bin/sh
#Author : Javen
printf "The complete list is %s\n" "$$"
printf "The complete list is %s\n" "$!"
printf "The complete list is %s\n" "$?"
printf "The complete list is %s\n" "$*"
printf "The complete list is %s\n" "$@"
printf "The complete list is %s\n" "$#"
printf "The complete list is %s\n" "$0"
printf "The complete list is %s\n" "$1"
printf "The complete list is %s\n" "$2
服務器測試
[root@iZ94hjirr10Z software]# ./test.sh Javen205 572839485
The complete list is 15409
The complete list is
The complete list is 0
The complete list is Javen205 572839485
The complete list is Javen205
The complete list is 572839485
The complete list is 2
The complete list is ./test.sh
The complete list is Javen205
The complete list is 572839485
程序調用
public class ShellController extends Controller {
public void index(){
String shell = getPara("shell");
ShellKit.execShell(shell);
renderText("執行完成...");
}
public void runShell(){
String shStr = getPara("shell");
try {
List<String> list = ShellKit.runShell(shStr);
renderJson(list);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
瀏覽器測試 並返回結果
http://120.76.45.85:8080/Demo/shell/runShell?shell=/home/software/test.sh Javen205 572839485
瀏覽器測試 不返回結果
http://120.76.45.85:8080/Demo/shell?shell=/home/software/test.sh Javen205 572839485
返回結果
["The complete list is 15416","The complete list is ","The complete list is 0","The complete list is Javen205 572839485","The complete list is Javen205","The complete list is 572839485","The complete list is 2","The complete list is /home/software/test.sh","The complete list is Javen205","The complete list is 572839485"]
如有疑問歡迎留言