当前位置: 技术问答>linux和unix
100分请教高手?(\\)\$*是什么意思?
来源: 互联网 发布时间:2016-09-21
本文导语: 请教高手,在bash completion,下面这一句话: 1348 # try to allow variable completion 1349 if [[ "$cur" == ?(\)$* ]]; then 1350 COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) ) 1351 return 0 13...
请教高手,在bash completion,下面这一句话:
1348 # try to allow variable completion
1349 if [[ "$cur" == ?(\)$* ]]; then
1350 COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )
1351 return 0
1352 fi
中?(\)$* 和 COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )是什么意思?
1348 # try to allow variable completion
1349 if [[ "$cur" == ?(\)$* ]]; then
1350 COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )
1351 return 0
1352 fi
中?(\)$* 和 COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )是什么意思?
|
你跑一下shopt看看是啥
|
if [[ "$cur" == ?(\)$* ]]; then
我觉得这句里的?(\)$*不算正则表达式 你确认你这句没贴错吗 我觉得会报错。
应该是if [[ "$cur" == "?(\)$*" ]]; then
就是判断变量cur的值是否等于字符串?()$* 第一个斜杠和第三个斜杠是转义字符的作用
COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )
这里面前半部分是compgen的命令的参数 你的看compgen的使用
"${cur#?(\)$}"这种叫parameter expansion
${parameter#word} 最短匹配
${parameter##word} 最长匹配
在这里word是一个模式(pattern) 如果parameter的开始匹配word模式 那么第一个的结果是最短匹配 第二个的结果是最长匹配
我觉得这句里的?(\)$*不算正则表达式 你确认你这句没贴错吗 我觉得会报错。
应该是if [[ "$cur" == "?(\)$*" ]]; then
就是判断变量cur的值是否等于字符串?()$* 第一个斜杠和第三个斜杠是转义字符的作用
COMPREPLY=( $( compgen -v -P '$' -- "${cur#?(\)$}" ) )
这里面前半部分是compgen的命令的参数 你的看compgen的使用
"${cur#?(\)$}"这种叫parameter expansion
${parameter#word} 最短匹配
${parameter##word} 最长匹配
在这里word是一个模式(pattern) 如果parameter的开始匹配word模式 那么第一个的结果是最短匹配 第二个的结果是最长匹配
|
我也认为那个地方不是正则 我测试了 在我的CentOS下不加引号就会报错 加引号就是字符串比较了。
|
应该是与环境有关。
就代码片断来说,就是Pattern Match(这里指的是通配符匹配,而不是平时所说的正则)。
可能通过命令来验证。
|
这个是bash中的通配符,?表示任意单个字符,*表示任意多个字符。
看一下下面这段代码的注释,就可以很清楚的理解了:
690 # This function splits $cur=--foo=bar into $prev=--foo, $cur=bar, making it
691 # easier to support both "--foo bar" and "--foo=bar" style completions.
692 # Returns 0 if current option was split, 1 otherwise.
693 #
694 _split_longopt()
695 {
696 if [[ "$cur" == --?*=* ]]; then
697 # Cut also backslash before '=' in case it ended up there
698 # for some reason.
699 prev="${cur%%?(\)=*}"
700 cur="${cur#*=}"
701 return 0
702 fi
703
704 return 1
705 }
关于"${cur#?(\)$}",见6楼的解释。
看一下下面这段代码的注释,就可以很清楚的理解了:
690 # This function splits $cur=--foo=bar into $prev=--foo, $cur=bar, making it
691 # easier to support both "--foo bar" and "--foo=bar" style completions.
692 # Returns 0 if current option was split, 1 otherwise.
693 #
694 _split_longopt()
695 {
696 if [[ "$cur" == --?*=* ]]; then
697 # Cut also backslash before '=' in case it ended up there
698 # for some reason.
699 prev="${cur%%?(\)=*}"
700 cur="${cur#*=}"
701 return 0
702 fi
703
704 return 1
705 }
关于"${cur#?(\)$}",见6楼的解释。