03.SpringShell命令参数-@ShellOption

SpringShell 提供了@ShellOption注解用于指定参数的帮助信息, 或对特殊参数进行处理.

1. 传参方式

  • SpringShell 命令调用时, 有两种传参方式, 一种是位置参数, 一种是命名参数. 虽然说也可以混合使用, 但是笔者不建议混合使用.
  • SpringShell 命令默认参数分隔符为多个空格, 如果要传入参数包含空格, 需要使用引号包裹.
  • SpringShell 参数严格匹配参数个数, 除非定义命令时指定的是可变参数
// 定义命令时: 第一个参数为username, 第二个参数为password
@ShellMethod("check username and password")
public String auth(String username, String password) {
    return "username:" + username + ", password:" + password;
}

1.1 位置参数

位置参数和参数顺序有关, 顺序为方法定义时参数排列顺序.

# 第一个参数root 会赋值给username, 第二个参数会赋值给pasword

shell:>auth root 123456
username:root, password:123456

shell:>auth 123456 root
username:123456, password:root

1.2 命名参数

  • 命名参数和参数位置无关, 默认需要使用"--"指定参数名称, 可通过在定义命令时@ShellMethod的prefix 属性更改参数前缀.
  • 对于布尔类型参数, 只能使用命名参数方式来赋值, 但是不能指定命名参数的值.
# 传参顺序不同, 毫无影响.

shell:>auth --password root --username root
username:root, password:root

shell:>auth --password 123456 --username root
username:root, password:123456

2. 特殊类型参数处理

2.1 一个参数接收多个值

对于数组, 集合等类型变量, 需要使用@ShellOption的arity属性明确指定接收的参数个数, 否则不能正确执行命令.

@ShellMethod("add three numbers")
public String multiSum(@ShellOption(arity = 3) int[] numbers) {
    int sum = numbers[0] + numbers[1] +numbers[2];

    return numbers[0] + "+" + numbers[1] + "+" + numbers[2] + "=" + sum;
}

@ShellMethod("multiply three numbers")
public String multiply(@ShellOption(arity = 3) List<Integer> numbers) {
    int result = numbers.get(0) * numbers.get(1) * numbers.get(2);
    return numbers.get(0) + "x" + numbers.get(1) + "x" + numbers.get(2) + "=" + result;
}
# 命名参数调用方式
shell:>multi-sum --numbers 1 2 3
1+2+3=6

# 位置参数调用方式
shell:>multiply 2 3 4
2x3x4=24

2.2 布尔类型参数

对于布尔类型参数, 相当于设置了arity=0, 只能通过命名参数指定名称来赋值, 且命名参数不能赋值. 赋值会出现异常.

@ShellMethod("shutdown")
public String shutdown(boolean force, int seconds) {
    return "force: " + force + ", seconds:" + seconds;
}
# 指定命名参数即为true, 无须赋值. 赋值会出现异常
sshell:>shutdown 30 --force
force: true, seconds:30
shell:>shutdown --force 30
force: true, seconds:30

# 不指定命名参数, 即为false
shell:>shutdown 30
force: false, seconds:30

2.3 参数引号处理

  • SpringShell 命令接收参数时, 默认以多个空格作为参数分隔符, 如果参数包含空格的话, 会被视为多个参数.
  • 对于包含空格的参数, 可以使用引号进行包裹.
  • 若想输出引号, 可以采用单引号双引号相互包裹, 或使用转移字符. 单引号和双引号完全等价, 不存在可转义不可转义差别.
# 使用引号包裹带空格字符串
shell:>echo "hello world"
hello world

# 单引号包裹双引号, 输出双引号
shell:>echo '"hello world"'
"hello world"

# 双引号包裹单引号, 输出单引号
shell:>echo "'hello world'"
'hello world'

# 双引号内转义字符, 输出双引号
shell:>echo "\"hello world\""
"hello world"

# 单引号内转义字符, 输出单引号
shell:>echo '\'hello world\''
'hello world'

2.4 参数设定默认值

当一个命令可接收参数也可不接收参数时, 可以通过指定参数默认值来解决. 比如说实现linux shell中的echo命令, 当没有参数时输出空行, 当有参数时输出参数.

@ShellMethod("print line")
public String echo(@ShellOption(defaultValue = "") String line) {
    return line;
}
# 无参调用
shell:>echo

# 有参调用, 包含空格的参数需要使用引号包裹
shell:>echo "hello world"
hello world

2.5 参数设定帮助信息

可以通过help 属性来指定参数的帮助信息, 使用help 命令查看参数时, 可以查看设定的帮助信息.

@ShellMethod("check username and password")
public String auth(
        @ShellOption(help = "用户名") String username,
        @ShellOption(help = "密码") String password) {
    return "username:" + username + ", password:" + password;
}
shell:>help auth
NAME
    auth - check username and password
SYNOPSYS
    auth [--username] string  [--password] string
OPTIONS
    --username  string
        用户名
        [Mandatory]
    --password  string
        密码
        [Mandatory]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容