Re: why not promote the plague ? (brace|rc|alternative|modern) syntax
"Mark J. Reed" <[email protected]>
| Newsgroups | gmane.comp.shells.zsh.devel,gmane.comp.shells.zsh.user |
|---|---|
| Message-ID | <CAA=-s3y6Xv4MDXWmmydgwPUSe5LK4+g15y5_S+hLYEAZW1U-Xg@mail.gmail.com> |
Sorry, please ignore, was an old draft I accidentally sent. On Mon, Dec 16, 2024 at 4:05 PM Mark J. Reed <[email protected]> wrote: > Let's try this again: > > First, we have the standard syntax that works in any POSIX shell: >> >> for var in val1 val2 val3; do command1; command2; done >> while command1; command2; do command3; command4; done >> until command1; command2; do command3; command4; done >> if command1; command2; then command3; command4; else command5; >> command6; fi >> >> The C-style *for* loop is not part of POSIX, but is common to bash, ksh, >> and zsh: >> >> for (( init; condition; increment )) do command1; command2; done >> >> The *repeat* loop is purely a Zsh innovation not present in the other >> shells: >> >> repeat $times; do command1; command2; done >> > >> > All of the above have alternative syntax in Zsh that works irrespective of >> the *SHORT_LOOPS* option. >> > > So far, so correct, but I got a little too specific with the details. > >> Since all of these constructs have the form *intro-keyword *part1 *keyword1 >> *part2 *keyword2*, the basic idea is to replace *keyword1 *and *keyword2 >> *with curly braces. But the *for*...*in *loop also has a *keyword0*, >> namely *in*, which needs its own d >> > >> for var (val1 val2 val3) { command1; command2; } >> while (command1; command2) { command3; command4; } >> until (command1; command2) { command3; command4; } >> if (command1; command2) { command3; command4; } else { command5; >> command6; } >> for (( init; condition; increment )) { command1; command2; } >> repeat $times { command1; command2; } >> >> NOTE: If the conditional command for while/until/if is a single ((...)) >> or [[...]] test, you don't need the extra parentheses around it. >> >> Finally, we have the Zsh "short" syntax, which works only with *setopt >> SHORT_LOOPS*, and *only if the body is a single command*: >> >> for var (val1 val2 val3) command1; >> while (command1; command2) command3 >> until (command1; command2) command3 >> if (command1; command2) command3; >> for (( init; condition; increment )) command1; >> >> NOTE: again, the parentheses can be omitted around a single ((...)) or >> [[...]] test. Also, as far as I know, there's no way to attach an *else* to >> an *if* when using the short syntax. >> >> On Sat, Dec 14, 2024 at 2:29 AM Marc Chantreux <[email protected]> wrote: >> >>> On Fri, Dec 13, 2024 at 07:07:17PM -0500, Lawrence Velázquez wrote: >>> > Mikael's point was to distinguish between the alternative forms >>> > and the SHORT_LOOPS forms. None of your examples works without >>> > SHORT_LOOPS >>> >>> thanks for noticing. which leads me to open zshmisc(1) and read >>> read "ALTERNATE FORMS FOR COMPLEX COMMANDS". TIL that my coding >>> style is actually a mix of the alternative form and SHORT_LOOPS >>> and the difference is subtile: >>> >>> « The short versions below only work if sublist is of the >>> form `{ >>> list }' or if the SHORT_LOOPS option is set » >>> >>> regards >>> -- >>> Marc Chantreux >>> >>> >> >> -- >> Mark J. Reed <[email protected]> >> > > > -- > Mark J. Reed <[email protected]> > -- Mark J. Reed <[email protected]>