diff --git a/translate/translate.go b/translate/translate.go index 48736e1..ffc9cf6 100644 --- a/translate/translate.go +++ b/translate/translate.go @@ -441,6 +441,57 @@ func (t *Translator) assign(prefix string, a *syntax.Assign) { } } +func (t *Translator) parseSetExpr(args []*syntax.Word) bool { + if len(args) < 2 { + return false + } + + next, _ := lit(args[1]) + + if next == "--" || next == "-" { + if len(args) >= 3 && isAtWord(args[len(args)-1]) { + if len(args) > 3 { + t.str("set -a argv") + for _, arg := range args[2 : len(args)-1] { + t.str(" ") + t.word(arg, false) + } + } + return true + } + + t.str("set argv") + for _, arg := range args[2:] { + t.str(" ") + t.word(arg, false) + } + return true + } + + for _, arg := range args[1:] { + flag, _ := lit(arg) + if !strings.HasPrefix(flag, "-") { + return false + } + } + return true +} + +func isAtWord(w *syntax.Word) bool { + if len(w.Parts) != 1 { + return false + } + dq, ok := w.Parts[0].(*syntax.DblQuoted) + if !ok || len(dq.Parts) != 1 { + return false + } + param, ok := dq.Parts[0].(*syntax.ParamExp) + if !ok { + return false + } + return param.Param.Value == "@" +} + func (t *Translator) callExpr(c *syntax.CallExpr) { if len(c.Args) == 0 { // assignment @@ -464,7 +515,12 @@ func (t *Translator) callExpr(c *syntax.CallExpr) { first := c.Args[0] l, _ := lit(first) + switch l { + case "set": + if t.parseSetExpr(c.Args) { + return + } case "shift": t.str("set -e argv[1]") case "unset": diff --git a/translate/translate_test.go b/translate/translate_test.go index 840e152..d7d171e 100644 --- a/translate/translate_test.go +++ b/translate/translate_test.go @@ -335,6 +335,10 @@ echo ${cool+a} echo ${cool:+a} echo ${cool-a} echo ${cool:-a} +set -Cefu +set -- x y z +set - x y z +set -- x "$@" unset ASPELL_CONF for i in a b c; do if [ -d "$i/lib/aspell" ]; then @@ -398,6 +402,10 @@ echo (set -q cool && echo 'a' || echo) echo (test -n "$cool" && echo 'a' || echo) echo (set -q cool && echo "$cool" || echo 'a') echo (test -n "$cool" && echo "$cool" || echo 'a') + +set argv x y z +set argv x y z +set -a argv x set -e ASPELL_CONF for i in a b c if [ -d "$i"'/lib/aspell' ]