shell腳本java執行jar命令解析

一.變量:
i.變量定義:
語法:
variable_name=variable_value

例如:
exe_cmd="java -jar $1 -cfp $2 -lfp $3 -tn1 $4 -tn2 $5 -d $6 -cld $7 -type $8"

注意:
1)變量定義賦值時,等號(=)兩邊不能存在空白字符。
2)變量值爲普通字符串時,使用單引號(''),值中命令是不識別的。
3)變量值爲執行命令時,使用雙引號(""),值中命令會識別的。
4)把變量結果賦值給變量:
  a.反引號(‘‘):exe_cmd1=‘exe_cmd‘ #不推薦,容易出錯.
  b.括號(()):exe_cmd2=(exe_cmd)  #推薦方式.
  
  
ii.變量引用:
$variable_name: 字符串拼接時不合適(推薦)。
${variable_name}:無限制(推薦)。 
variable_name: 直接使用變量(不推薦)。


iii.常用變量:
shell變量:
1)腳本後面傳遞的變量:
$0      當前腳本的文件名
$1    腳本後的第一串字符串
$2    腳本中的第二串字符串
$3    腳本後的第三串字符串
...
$n  傳遞給腳本或函數的參數。n是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。

2)特殊變量列表
$#    腳本後所跟字符串的個數
$*    腳本後跟的所有字符串,模式爲“ 1 2 3 4 ”(只輸入一串字符串)
$@    腳本後跟的所有字符串,模式爲“ 1 ” “ 2 ” “ 3 ” “ 4 ”(輸入了四串字符串)
$$  腳本後跟進程id
$?  查看上一條shell命令的退出狀態碼(特殊變量)


iiii.退出狀態碼:
shell查看上一條shell命令的退出狀態碼(特殊變量):
$?

注意:
1)退出狀態碼是一個 0 ~ 255 之間的整數值,超出這個範圍將會執行取模運算,在命令結束運行時由命令傳給shell。
2)退出狀態碼,在腳本中直接獲取使用,例如:echo $?。


二.執行腳本:
i.java命令二方庫插件:
1)java命令說明:
命令:java -jar $1 -cfp $2 -lfp $3 -tn1 $4 -tn2 $5 -d $6 -cld $7 -type $8
說明:
a)通過jar包指定的main方法入口,傳入到方法參數中.
b)-xxx表示參數key,$x對應參數值;相鄰-xxx與key爲一組key-value兼職對;
c)解析java參數爲String數組,並只有jar文件後參數纔會被傳入到參數。
d)上面命令$1爲jar文件名,$1以後的參數會被傳入到java字符串數組中。
String [] args = {"-cfp",$2,"-lfp",$3,"-tn1",$4,"-tn2",$5,"-d",$6,"-cld",$7,"-type":$8}
e)commons-cli、picocli與JCommander插件定義的接收參數key,若少於java命令參數key會報錯,相反則不會。

2)插件對比:
插件    特點    更新狀態    相關文檔
apache common開源項目commons-cli    基於代碼來配置和設置參數    更新遲緩    項目地址:https://commons.apache.org/proper/commons-cli/
picocli    "1)封裝了很多的概念,比如Command,方便基於命令來調用不同的邏輯處理,基於註解來設置各類arg Option,滿足日常的使用和操作。
2)提供了豐富的功能,且支持Command的命令定義以及subcommand的方式,比較適合命令行的工具開發。"    更新比較活躍    "地址: https://github.com/remkop/picocli 
示例:https://github.com/kakawait/picocli-spring-boot-starter"
JCommander    JCommander首選,文檔齊備,非常完整和細緻,基於註解來進行命令的設置,簡單易用,基本滿足了命令行工具的全部需求。    更新比較活躍    "項目地址: https://github.com/cbeust/jcommander 
文檔地址: http://jcommander.org/"

3)相關示例:
3.1)commons-cli 插件
a)pom.xml依賴:
<dependency>
     <groupId>commons-cli</groupId>
     <artifactId>commons-cli</artifactId>
     <version>1.4</version>
</dependency>

b)java代碼:
public Map<String,Object> commonsCliExplain(String [] args){
        Options options = new Options();
        Option filepath = new Option("sfp", "filepath", true, "input data file path");
        filepath.setRequired(true);
        options.addOption(filepath);

        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        Map<String,Object> map = new HashMap<String,Object>();
        try {
            CommandLine com = parser.parse(options, args);
            Iterator<Option> iterator = com.iterator();
            while (iterator.hasNext()){
                Option option = iterator.next();
                map.put(option.getLongOpt(),option.getValue());
            }
        } catch (Exception ex) {
            logger.error("CommandExplain.commonsCliExplain:",ex);
            formatter.printHelp("java ", options);
        }
        return map;
    }

3.2)picocli插件
a)pom.xml依賴:
<dependency>
   <groupId>info.picocli</groupId>
   <artifactId>picocli</artifactId>
   <version>3.9.6</version>
</dependency>


b)java代碼:
public PicocliArgs picocliExplain(String [] args){
      PicocliArgs picocliArgs = new PicocliArgs();
      try {
            picocli.CommandLine.run(picocliArgs, System.out, args);
      } catch (Exception ex) {
            logger.error("CommandExplain.picocliExplain:",ex);
      }
      return picocliArgs;
}


 class PicocliArgs implements  Runnable{
     @picocli.CommandLine.Option(names = { "-sfp"}, description = "源數據文件")
     private String sfp;

     @Override
     public void run() {}
}


3.3)jcommander插件
a)pom.xml依賴:
<dependency>
  <groupId>com.beust</groupId>
  <artifactId>jcommander</artifactId>
  <version>1.78</version>
</dependency>


b)java代碼:
public JCommanderArgs jcommanderExplain(String [] args){
    JCommanderArgs jCommanderArgs = new JCommanderArgs();
    try {
        JCommander.newBuilder()
                .addObject(jCommanderArgs)
                .build()
                .parse(args);
     } catch (Exception ex) {
         logger.error("CommandExplain.jcommanderExplain:",ex);
     }
     return jCommanderArgs;
}

class JCommanderArgs{
     @Parameter(names = "-sfp", description = "源數據文件")
     private String sfp;
}


ii.start.sh啓動腳本內容:
exe_cmd="java -jar $1 -cfp $2 -lfp $3 -tn1 $4 -tn2 $5 -d $6 -cld $7 -type $8"
if $exe_cmd ; then
 echo "$2 is done!"
else 
 echo "$2 is fail!"
 exit 205
fi

exe_cmd="java -jar $1 -cfp $2 -lfp $3 -tn1 $4 -tn2 $5 -d $6 -cld $7 -type $8"
{ # try
$exe_cmd &&
echo "$2 is done!"
} || { # catch
echo "$2 is fail!"
exit 205
}

注意:
調用java進程成功,返回:0 ,並非"$2 is fail!"轉換十進制的取模值。
調用java進程失敗,返回:205
shell腳本執行完成,進程退出碼默認返回0
jar命令參數key在接收插件中未定義會報key找不到錯誤。

iii.啓動命令:
./www/validateData/current/start.sh /www/validateData/current/validateData-1.0-SNAPSHOT.jar /www/validateData/validate_data_20191020.csv validate_data_20191020.log 10 2 2019-05-20 2019-05-20 1

三.附註:
shell更詳命令請見:https://www.cnblogs.com/renyz/p/11297664.html
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章