我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java:自定义变量加载到系统变量后替换shell模版并执行shell

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java:自定义变量加载到系统变量后替换shell模版并执行shell

这里的需求前提是,在项目中进行某些操作前,需要在命令后对shell配置文件的进行修改(如ip、port),这个对于用户是不友好的,需要改为用户页面输入ip、port,后台自动去操作修改配置;那么这篇博客的由来就有了。

在这里插入图片描述
上面图片是AI创作,未经允许,不可商用哦!

目录


以下为实际工作简化后描述

实现功能描述

  1. 项目加载自定义变量
  2. 自定义变量替换shell模版内容
  3. 项目运行shell

功能实现拆解

针对上述功能描述,其实可以拆解为三步

  1. 实现项目加载自定义变量
  2. 实现替换shell模版内容
  3. 运行shell

项目加载自定义变量

这里有两种实现,
一种是项目加载自定义变量文件到系统变量中;
另一种是shell通过source .env环境变量方式加载。

项目加载自定义变量文件到系统变量中

这种方法的好处是项目中可以获取到自定义变量,如果项目代码需要获取自定义变量进行操作,可以考虑使用此方式

新增一个自定义变量文件(当然也可以在代码中固定写入变量直接加载到系统中,这样的缺点就是不灵活,如果有变动就需要改代码)

自定义变量文件如下
BASE_ROOT_DIR=/homeLICENSE_PATH=/home/LICENSEPACKAGE_PATH=/home/test.tar.gz
java代码如下
        public static void loadProperties(String configFile){        try {            FileInputStream propFile = new FileInputStream(configFile);            Properties p = new Properties(System.getProperties());            p.load(propFile);            System.setProperties(p);        } catch (Exception e) {            e.printStackTrace();        }    }

调用loadProperties方法后,就可以通过System.getProperty("key")获取自定义的变量了
如获取BASE_ROOT_DIRSystem.getProperty("BASE_ROOT_DIR")

实操验证如下

自定义变量文件
在这里插入图片描述

测试代码

import java.io.FileInputStream;import java.util.Properties;public class LoadProperties {    public static void main(String[] args) {        String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh";        loadProperties(configFile);        System.out.println("BASE_ROOT_DIR: " + System.getProperty("BASE_ROOT_DIR"));        System.out.println("LICENSE_PATH: " + System.getProperty("LICENSE_PATH"));        System.out.println("PACKAGE_PATH: " + System.getProperty("PACKAGE_PATH"));    }    public static void loadProperties(String configFile){        try {            FileInputStream propFile = new FileInputStream(configFile);            Properties p = new Properties(System.getProperties());            p.load(propFile);            System.setProperties(p);        } catch (Exception e) {            e.printStackTrace();        }    }}

运行输出结果
在这里插入图片描述

shell通过source .env环境变量文件方式加载

这种方法的好处是在shell执行时直接获取环境变量,不需要项目代码做多余的操作

  1. 新增一个.env环境变量文件(如test.env)
  2. 当在执行的shell文件中首行加入source命令(source test.env)或者先在命令行执行命令source test.env后,执行shell文件
test.env环境变量文件如下
BASE_ROOT_DIR=/homeLICENSE_PATH=/home/LICENSEPACKAGE_PATH=/home/test.tar.gz
shell模版文件如下
cd ${DATASYS_BASE_ROOT_DIR}pwdecho "DATASYS_PACKAGE_PATH: ${DATASYS_PACKAGE_PATH}"echo "PACKAGE_PATH: ${PACKAGE_PATH}"echo "LICENSE_PATH: ${LICENSE_PATH}"
实操验证如下

创建shell模版文件 test.sh,并执行
在这里插入图片描述
创建环境变量文件 test.env,并在test.sh文件首行加入命令:source test.env
在这里插入图片描述

替换shell模版并运行

因为替换是否成功,只有通过运行结果才能有力证明,所以我们放在一起看

由于替换shell模版内容的具体操作受自定义变量加载方式影响,所以我们还是按照两种加载方式来看

项目加载自定义变量文件到系统变量中

如果是项目加载自定义变量文件到系统变量中,还需要项目获取变量并传入shell替换;

代码如下

import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.util.Properties;public class LoadProperties {    public static void main(String[] args) {        String configFile = "/Users/kunzhi/Downloads/learn/linuxTest/config.sh";        //加载自定义环境变量        loadProperties(configFile);        String BASE_ROOT_DIR = System.getProperty("BASE_ROOT_DIR");        String LICENSE_PATH = System.getProperty("LICENSE_PATH");        String PACKAGE_PATH = System.getProperty("PACKAGE_PATH");        System.out.println(BASE_ROOT_DIR + ": " + System.getProperty("BASE_ROOT_DIR"));        System.out.println(LICENSE_PATH + ": " + System.getProperty("LICENSE_PATH"));        System.out.println(PACKAGE_PATH + ": " + System.getProperty("PACKAGE_PATH"));                //需要传入shell模版替换的内容        String[] evnp = {"BASE_ROOT_DIR=" + BASE_ROOT_DIR, "LICENSE_PATH=" + LICENSE_PATH, "PACKAGE_PATH=" + PACKAGE_PATH};        String shellFile = "/Users/kunzhi/Downloads/learn/linuxTest/test1.sh";        //替换并运行shell        replaceAndRun(shellFile, evnp);    }    //加载自定义环境变量    public static void loadProperties(String configFile){        try {            FileInputStream propFile = new FileInputStream(configFile);            Properties p = new Properties(System.getProperties());            p.load(propFile);            System.setProperties(p);        } catch (Exception e) {            e.printStackTrace();        }    }    //替换并运行shell    private static void replaceAndRun(String path, String[] evnp) {        try {            Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, evnp,null);            //只有process.waitFor() 结果为0,才说明执行成功了            if (process.waitFor() != 0) {                throw new Exception(String.valueOf(process.waitFor()));            }            InputStreamReader ir = new InputStreamReader(process.getInputStream());            LineNumberReader input = new LineNumberReader(ir);            String line;            //输入shell中执行的每一行            while ((line = input.readLine()) != null){                if (line.contains("ERROR")) {                    throw new Exception("ERROR");                }                System.out.println(line);            }        } catch (Exception e) {            System.out.println(e);        }    }}

运行结果
在这里插入图片描述

shell通过source .env环境变量文件方式加载

如果是shell通过source .env环境变量方式加载,在上一步实操演示可以看出,其实已经达到替换效果,直接执行shell文件即可了

代码如下

package test;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.util.Properties;public class LoadProperties {    public static void main(String[] args) {        runShell(shellFile1);    }    private static void runShell(String path) {        try {            Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", path}, null,null);            if (process.waitFor() != 0) {                throw new Exception(String.valueOf(process.waitFor()));            }            InputStreamReader ir = new InputStreamReader(process.getInputStream());            LineNumberReader input = new LineNumberReader(ir);            String line;            while ((line = input.readLine()) != null){                if (line.contains("ERROR")) {                    throw new Exception("ERROR");                }                System.out.println(line);            }        } catch (Exception e) {            System.out.println(e);        }    }}

来源地址:https://blog.csdn.net/m0_37482190/article/details/129227983

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java:自定义变量加载到系统变量后替换shell模版并执行shell

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录