4

In bash at least, if and case blocks are closed like this:

if some-expr
then
    echo "hello world"
fi

case $some-var in
[1-5])
    do-a-thing
    ;;
*)
    do-another-thing
esac

as opposed to the more typical close of end or endif/endcase. As far as I know, this rather funny convention is unique to shell scripting and I have never seen such an odd block terminator anywhere else. Sometimes things like this have an origin in another language (like Ruby's elsif coming from Perl), or a strange justification. Does this feature of shell scripting have a story behind it? Is it found in other languages?

11

According to Wikipedia, the sh program reused the syntax from ALGOL 68.

Stephen Bourne carried into this shell some aspects of the ALGOL 68C compiler that he had been working on at Cambridge University. Notably he reused portions of ALGOL 68's "if ~ then ~ elif ~ else ~ fi", "case ~ in ~ esac" and "for ~ while ~ do ~ od" (using done instead of od) clauses in the common Unix Bourne shell syntax.

Since Bash was the GNU replacement of sh, it reused the same syntax for backwards compatibility.

  • 4
    I guess Bourne used done rather than od because od is a command (octal dump). – Keith Thompson Jun 12 '12 at 5:39
6

No. You find these "reversed" language constructs in many languages:

  • { and },
  • /* and */
  • (* and *)

:)

  • Not to mention the "ohm" and the "mho"... :-) – NevilleDNZ Nov 23 '12 at 6:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.