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

如有疑问欢迎留言

Java程序调用带参数的shell脚本返回值的更多相关文章

  1. Java代码调用服务器上的Shell脚本

    Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...

  2. 在Java中调用带参数的存储过程

    JDBC调用存储过程: CallableStatement 在Java里面调用存储过程,写法那是相当的固定: Class.forName(.... Connection conn = DriverMa ...

  3. C#调用带参数的python脚本

    问题描述:使用C#调用下面的带参数的用python写的方法,并且想要获取返回值. def Quadratic_Equations(a,b,c): D=b**2-4*a*c ans=[] ans.app ...

  4. shell脚本返回值问题

    如果学习过高级语言比如java和c语言等,此时你要是获取一个函数的返回值,直接在函数里面写上return即可,然后在函数执行时将返回结果赋值给某个变量即可.但是在shell脚本中限制较多,因此如果我们 ...

  5. 【原】Java程序调用远程Shell脚本

    此程序的目的是执行远程机器上的Shell脚本. [环境参数]远程机器IP:192.168.234.123用户名:root密码:rootShell脚本的路径:/home/IFileGenTool/Bak ...

  6. java调用机器上的shell脚本

    java调用机器上的shell脚本,可以这样方便的通过shell脚本调用本机的C.C++等程序 Process process = null; Runtime runTime = Runtime.ge ...

  7. java远程调用linux的命令或者脚本

    转载自:http://eksliang.iteye.com/blog/2105862 Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 使用步骤如下 ...

  8. java程序调用存储过程

    java程序调用存储过程       PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...

  9. java程序调用存储过程和存储函数

    java程序调用存储过程 jdbcUtil.java文件 package cn.itcast.oracle.utils; import java.sql.Connection; import java ...

随机推荐

  1. [BZOJ4864][BeiJing2017Wc]神秘物质(splay)

    首先merge就是先delete两次再insert,Max就是整个区间的最大值减最小值,Min就是区间中所有相邻两数差的最小值. Splay支持区间最大值,区间最小值,区间相邻差最小值即可. #inc ...

  2. ROW_NUMBER() OVER函数运用

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) PARTITION BY:相当于数据库中的group by 说明:row_numbe ...

  3. js异步任务处理方式

    一.es6(es2015)之前:使用原始的callback函数,会陷入回掉地域 this.$http.jsonp('/login', (res) => { this.$http.jsonp('/ ...

  4. DDos与CC攻击的简单个人理解

    DDos简单来说就是向指定IP发送大量无用的数据包,造成网卡堵塞. CC理解成模拟表单提交,真实模拟业务,但量大之后也会造成网络堵塞. 参考: http://www.enkj.com/idcnews/ ...

  5. MySQL在控制台上以竖行显示表格数据

    直接在SQL语句后面加\G即可,如: select * from user limit 10\G; 如果想要知道这些参数可以直接在命令行后面加入\?

  6. window server 2012 更改密钥 更改系统序列号

    由于在window server 2012当中,好像更改密钥的方法,给隐藏了,没办法激活,这里记录一下在网上查找到的一个命令行,如何在window server 2012 更改密钥 更改系统序列号 在 ...

  7. make and make bzImage

    2.6内核 make = make bzImage + make modules 无非是改下Makefile而已 2.4 内核 01.make menuconfig 02.make dep 03.ma ...

  8. perf 工具介绍1

    https://perf.wiki.kernel.org/index.php/Tutorial http://os.51cto.com/art/201105/265133.htm 在LINUX 源代码 ...

  9. 四种更新UI的方法

    笔记:   // 使用handler.post(Runnable)更新UI public void updateUI_Fun1() { new Thread() { public void run() ...

  10. 【笨木头Lua专栏】基础补充05:迭代器番外篇

    关于迭代器的内容, 另一点点,只是已经无关紧要了.应该算是一种扩展吧.就一起来开开眼界好了~ 笨木头花心贡献.哈?花心?不.是用心~ 转载请注明,原文地址: http://www.benmutou.c ...