Java程序调用带参数的shell脚本返回值

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.xxx:8080/Demo/shell/runShell?shell=/home/software/test.sh      Javen205 572839485

浏览器测试 不返回结果

http://120.xxx: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"]

如有疑问欢迎留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,658评论 19 139
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 9,229评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,991评论 18 399
  • [奸笑][奸笑]又是一个故居的梗[嘘][嘘]女神张没有写完但也一点不影响作品的魅力。因为电视剧的缘故少帅才入了姐的...
    莉莉神马斯基阅读 3,043评论 0 0
  • 一大早照了下镜子 吓了我一跳 竟然 竟然 长了细细的鱼尾纹 一下子感觉 年龄老了好几岁 于是就陷入了一种恐惧之中 ...
    BINGBIGN阅读 864评论 1 1