一.變量:
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