java调⽤shell脚本并传参
java调⽤shell脚本并传参
private void invokeShell(String projectDirectory, String ipaOutputDirectory, String version, String appName) { try {
//第⼀个参数是sh命令,第⼆个参数是脚本,从第三个参数天始,是我们要传到脚本⾥的参数。ProcessBuilder pb = new ProcessBuilder("/bin/sh",
Resource("/").getFile() + "/ipa-build.sh",
projectDirectory,
"-o", ipaOutputDirectory,
"-v", version,
"-i", appName,
"-n");
Process p = pb.start();
process.waitFor();
try {
InputStreamReader ir = new InputStream());
LineNumberReader input = new LineNumberReader(ir);
String line = null;
while ((line = adLine()) != null){
logger.info("info:" + line);//打印输出内容
}
if(null != input){
input.close();
}
if(null != ir){
ir.close();
}
int extValue = p.waitFor();
logger.info("extValue:" + extValue);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
java代码调⽤shell脚本
public void importDateTohive() {
try {
String shpath = "/data/hadoop/percisettask/2_merge_userlog.sh";
Process ps = Runtime().exec(shpath);
ps.waitFor();
BufferedReader br = new BufferedReader(new InputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
logger.info("数据刷新成功");
}
上述代码中,下⾯这段就是调⽤shell执⾏的代码。
String shpath = "/data/hadoop/percisettask/2_merge_userlog.sh";
Process ps = Runtime().exec(shpath);
ps.waitFor();
注意:shpath最好写绝对路径。
1⼈点赞
java
java执⾏bat脚本和shell脚本并传⼊参数
转载pengjunlee 最后发布于2019-05-27 18:15:02 阅读数 28173 收藏
展开
之前想着在windows下和linux下调⽤⼀些python Scrapy的接⼝,发现路径问题,传参数问题都挺⿇烦,遂改为在bat⽂件和shell中具体写⽅法,然后执⾏他们就好了
1.执⾏bat脚本
(1)传⼊参数
bat处理⽂件中可引⽤的参数为%0%9,%0是指批处理⽂件的本⾝,也可以说是⼀个外部命令;%1%9是批处理参数,也称形参,例如:新建⼀个⽂件test_argv.bat,⽂件内容如下:
@echo off
echo param[0] = %0
echo param[1] = %1
echo param[2] = %2
echo param[3] = %3
echo param[4] = %4
echo param[5] = %5
echo ...
pause
调⽤时只需要在执⾏bat⽂件后加上参数即可,记得参数间有空格
test_argv.bat 1 game test what
此时输出:
param[0] = test_argv.bat
param[1] = 1
param[2] = game
param[3] = test
param[4] = what
param[5] =
请按任意键继续…
(2)调⽤
最简单的调⽤
这样调⽤是不会有回显的,如果你需要看到返回结果,就需要这样:
try {
// 执⾏ping命令
Process process = Runtime().exec("cmd /c e:&dir");
BufferedReader br = new BufferedReader(new InputStream(), Charset.forName("GBK")));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
注意到了吗,这次的exec函数不是简单的选择bat⽂件的路径,多了“cmd /c” 这个前缀有以下使⽤⽅式:
cmd /c dir 是执⾏完dir命令后关闭命令窗⼝。
cmd /k dir 是执⾏完dir命令后不关闭命令窗⼝。
cmd /c start dir 会打开⼀个新窗⼝后执⾏dir指令,原窗⼝会关闭。
cmd /k start dir 会打开⼀个新窗⼝后执⾏dir指令,原窗⼝不会关闭。
注意:第⼆个调⽤⽅式在bat的输出内容过长时,会卡死!!!T_T
⽹上的解释说“因为本地进程输⼊输出缓存有限,你不快点读取的话Process就挂在那了。” 所以需要开⼀个进程去不断的取数据,具体实现⽅式见:。这个我没有检测,因为我发现,如果bat输出的内容过长时,使⽤第⼀种⽅式,不会卡死,若是想看到输出可以加前缀cmd /k start,若是想把输出存起来就加上后缀 >&,就好了,毕竟还要开线程太繁琐。
2.执⾏shell⽂件
(1)传⼊参数
shell脚本传⼊参数与bat基本⼀致,只不过形参变成了$1,,$2,$3…..
例如,脚本test.sh的内容如下:
name=$1
echo "the ${name} are great man!"
执⾏./test.sh Xiao Ming命令,可以看到⾃⼰编写脚本的结果
the Xiao Ming are great man!
(2)调⽤
linux环境果然友好得多,封装好了以下代码,传⼊shell⽂件的路径就好了
public static String linuxShellexec(String shellPath) {
String result="";
try {
Process ps = Runtime().exec(shellPath);
ps.waitFor();
BufferedReader br = new BufferedReader(new InputStream()));
StringBuffer sb = new StringBuffer(); String line;
while ((line = br.readLine()) != null) { sb.append(line).append("\n");
}
result = sb.toString();
}
catch (Exception e) {
e.printStackTrace();
result="linux下运⾏完毕";
}
return result;
shell代码}
参考⽂章

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。