Test your square brackets

(fluca1978.github.io)

28 points | by speckx 6 days ago ago

16 comments

  • xg15 12 minutes ago

    So if you really want to troll someone, you can put them in quotes.

      if "[" "$foo" "==" "bar" "]"; then ...
  • reactordev an hour ago

    The ultimately sad part was the professor in a Sun OS machine.

    In a corner with no where to go, giving demerits because his bash was older than he realized.

    Reminds me of my college professor that claimed you don’t have to close HTML tags (some you absolutely do) and I proved that you do. Not all of them, but most of them. (Netscape Navigator Days)

    • jonhohle 3 minutes ago

      It doesn’t have anything to do with bash (though modern bash may use a built in for `[`). He don’t have the `[` program (usually linked to `test`).

  • ndsipa_pomu 3 minutes ago

    Here's Greg's Wiki about the difference between [, [[ and test

    https://mywiki.wooledge.org/BashFAQ/031

  • Wowfunhappy an hour ago

    > When I was a young, green, university student, I was forced to use test(1) as the only true way to do testing in shell scripting. […] Yeah, I was also forced to not use semicolons as they were evil (according to my professor, any comment unneeded!).

    The author’s professor clearly went gone overboard, but doesn’t this entire anecdote demonstrate the value of teaching it this way? Having green students call the `test` binary provides more insight into how UNIX operates, and gets them into that mindset.

    • ogogmad 5 minutes ago

      Hmm. What if we replaced the whole of bash with the contents of /bin?

  • stabbles an hour ago

    Nowadays [ is a builtin. The subprocess for a simple branch would be excessive overhead.

    • MontyCarloHall 43 minutes ago

      It is indeed a builtin, but `/bin/[` still exists for compatibility reasons!

         $ which [
         /bin/[
         $ type [
         [ is a shell builtin
      
      The same is true for the `test` command:

         $ which test
         /bin/test
         $ type test
         test is a shell builtin
  • theandrewbailey an hour ago

    Now do [ ... ] and [[ ... ]]

    I'm still not sure when to use one or the other. I use double brackets by default until something doesn't work.

    • nickjj 29 minutes ago

      [[ ... ]] supports regex comparisons and lets you combine multiple conditions in a single bracket group using && and || instead of remembering to use -a / -o.

      I usually default to [ ... ] unless I need features that double brackets provide.

    • PhilipRoman an hour ago

      [[...]] is non-portable and has an extremely quirky corner case with variable expansion in arithmetic contexts, what's not to love?

      • ndsipa_pomu 6 minutes ago

        I'm intrigued - any info on that?

        I personally use ((...)) for arithmetic tests and [[...]] for all other tests as I just target new versions of BASH and don't care much about POSIX compatibility.

    • ndsipa_pomu 5 minutes ago

      Use ((...)) for arithmetic tests and [[...]] for other tests. [...] is for POSIX compatibility and not as useful as [[...]] though I don't remember the specifics.

    • stabbles an hour ago

      Double brackets are less portable. For example musl linux does not come with bash by default, and your script fails.

      When unsure, use shellcheck.

      • duskdozer an hour ago

        You mean shellcheck will detect when single brackets won't be enough? I've also just defaulted to double because I never really looked into it

      • a3w an hour ago

        [[ is built in, so "test[" as an /usr/bin artifact never exists? (What to call that proposed program, test2, or test[ ?)