mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Add detection of "special parameters" for substitution
Detect Special parameters as defined in http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02 Treat these as parameters that are not set, instead of producing an error that a modifier is missing. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
8687a3f4b8
commit
9654e9b6f8
3 changed files with 51 additions and 6 deletions
|
@ -174,3 +174,38 @@ A|$9 |
|
||||||
A|${9} |
|
A|${9} |
|
||||||
A|${9:+bbb} |
|
A|${9:+bbb} |
|
||||||
A|${9:-bbb} | bbb
|
A|${9:-bbb} | bbb
|
||||||
|
|
||||||
|
# Special parameters won't be set in the Dockerfile:
|
||||||
|
# http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02
|
||||||
|
A|$@ |
|
||||||
|
A|${@} |
|
||||||
|
A|${@:+bbb} |
|
||||||
|
A|${@:-bbb} | bbb
|
||||||
|
A|$* |
|
||||||
|
A|${*} |
|
||||||
|
A|${*:+bbb} |
|
||||||
|
A|${*:-bbb} | bbb
|
||||||
|
A|$# |
|
||||||
|
A|${#} |
|
||||||
|
A|${#:+bbb} |
|
||||||
|
A|${#:-bbb} | bbb
|
||||||
|
A|$? |
|
||||||
|
A|${?} |
|
||||||
|
A|${?:+bbb} |
|
||||||
|
A|${?:-bbb} | bbb
|
||||||
|
A|$- |
|
||||||
|
A|${-} |
|
||||||
|
A|${-:+bbb} |
|
||||||
|
A|${-:-bbb} | bbb
|
||||||
|
A|$$ |
|
||||||
|
A|${$} |
|
||||||
|
A|${$:+bbb} |
|
||||||
|
A|${$:-bbb} | bbb
|
||||||
|
A|$! |
|
||||||
|
A|${!} |
|
||||||
|
A|${!:+bbb} |
|
||||||
|
A|${!:-bbb} | bbb
|
||||||
|
A|$0 |
|
||||||
|
A|${0} |
|
||||||
|
A|${0:+bbb} |
|
||||||
|
A|${0:-bbb} | bbb
|
||||||
|
|
|
@ -318,7 +318,7 @@ func (sw *shellWord) processName() string {
|
||||||
|
|
||||||
for sw.scanner.Peek() != scanner.EOF {
|
for sw.scanner.Peek() != scanner.EOF {
|
||||||
ch := sw.scanner.Peek()
|
ch := sw.scanner.Peek()
|
||||||
if name.Len() == 0 && unicode.IsDigit(ch) {
|
if name.Len() == 0 && (unicode.IsDigit(ch) || isSpecialParam(ch)) {
|
||||||
ch = sw.scanner.Next()
|
ch = sw.scanner.Next()
|
||||||
return string(ch)
|
return string(ch)
|
||||||
}
|
}
|
||||||
|
@ -332,6 +332,18 @@ func (sw *shellWord) processName() string {
|
||||||
return name.String()
|
return name.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isSpecialParam checks if the provided character is a special parameters,
|
||||||
|
// as defined in http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02
|
||||||
|
func isSpecialParam(char rune) bool {
|
||||||
|
switch char {
|
||||||
|
case '@', '*', '#', '?', '-', '$', '!', '0':
|
||||||
|
// Special parameters
|
||||||
|
// http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (sw *shellWord) getEnv(name string) string {
|
func (sw *shellWord) getEnv(name string) string {
|
||||||
for _, env := range sw.envs {
|
for _, env := range sw.envs {
|
||||||
i := strings.Index(env, "=")
|
i := strings.Index(env, "=")
|
||||||
|
|
|
@ -26,13 +26,11 @@ func TestShellParser4EnvVars(t *testing.T) {
|
||||||
line := scanner.Text()
|
line := scanner.Text()
|
||||||
lineCount++
|
lineCount++
|
||||||
|
|
||||||
// Trim comments and blank lines
|
// Skip comments and blank lines
|
||||||
i := strings.Index(line, "#")
|
if strings.HasPrefix(line, "#") {
|
||||||
if i >= 0 {
|
continue
|
||||||
line = line[:i]
|
|
||||||
}
|
}
|
||||||
line = strings.TrimSpace(line)
|
line = strings.TrimSpace(line)
|
||||||
|
|
||||||
if line == "" {
|
if line == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue