无标题文档
人多不足以依赖,要生存只有靠自己。
      深窥自己的心,而后发觉一切的奇迹在你自己。
          凡事皆有终结,因此,耐心是赢得成功的一种手段。

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

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

首先来看看linux中shell变量(#,@,0,1,$2)的含义解释
变量说明:

  • $$ 
    Shell本身的PID(ProcessID)
  • $! 
    Shell最后运行的后台Process的PID
  • $? 
    最后运行的命令的结束代码(返回值)
  • $- 
    使用Set命令设定的Flag一览
  • "*"用「"」括起来的情况、以"12 … $n"的形式输出所有参数。
  • @"@"用「"」括起来的情况、以"$1" "2""n" 的形式输出所有参数。
  • #  添加到Shell的参数个数0 Shell本身的文件名 1n 添加到Shell的各参数值。112是第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"]

如有疑问欢迎留言

posted @   酷玩时刻  阅读(9105)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
友情链接:快递查询 快递查询
点击右上角即可分享
微信分享提示