diff --git a/translate/translate.go b/translate/translate.go index 48736e1..4e5e313 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -631,6 +631,14 @@ func (t *Translator) paramExp(p *syntax.ParamExp, quoted bool) { t.str(expr) return } + + // $#, ${#} -> (count $argv) + switch param { + case "#", "$#", "${#}": + t.printf("(count $argv)") + return + } + if argvRe.MatchString(param) { t.printf(`$argv[%s]`, param) return @@ -643,6 +651,7 @@ func (t *Translator) paramExp(p *syntax.ParamExp, quoted bool) { } param = spec } + switch { case p.Excl: // ${!a} unsupported(p) @@ -651,6 +660,8 @@ func (t *Translator) paramExp(p *syntax.ParamExp, quoted bool) { switch p.Param.Value { case "@", "*": index = &syntax.Word{Parts: []syntax.WordPart{p.Param}} + t.printf("(count $argv)") + return } if index != nil { if word, ok := index.(*syntax.Word); ok { diff --git a/translate/translate_test.go b/translate/translate_test.go index 840e152..c11ff74 100644 --- a/translate/translate_test.go +++ b/translate/translate_test.go @@ -356,6 +356,8 @@ until true; do echo 2 done call $me +echo $# +echo ${#} echo ${#@} echo ${#cool[@]} echo ${#cool} @@ -419,6 +421,8 @@ while not true end call $me echo (count $argv) +echo (count $argv) +echo (count $argv) echo (count $cool) echo (string length "$cool") set a (ok | string collect; or echo)