6 comments

[ 2.3 ms ] story [ 28.1 ms ] thread
Interesting, but a whole lor shorter than what I expected to be honest.
Also, set -e is not a good flag to rely on, because it can really trip you up if you do anything at all that involves subshells, e.g.:

  set -e

  function foo {
      false
      echo foo
  }

  i=1
  while [[ i -le 20 ]]; do
      echo "$i $(foo)"
      i=$((i+1))
  done
The first example has a lot more use cases than it alludes to. I have a lot of aliased utility scripts for text processing, and frequently need to use them over entire files as well as on output piped from other processes. In this case, I don't know if the input file is going to be an argument or stdin from some upstream operation. That's easily taken care of with

  INPUT_FILE="${1:-/dev/stdin}"
Which sets the input to the first argument if there is one, or stdin if there isn't. My solution was a lot messier before I learned about parameter substitution.
It's not advanced, it's not long enough, and it's not correct either.

> This will set the value of TMP to `/tmp/myproject` only if it has not been set.

This should read "if", not "only if". And it should read: "This will set the value of TMP to `/tmp/myproject` if it has not been set or if it is null."

The form that means 'if it has not been set' has no colon; it is

  TMP=${TMP-/tmp/myproject}
  
See https://www.gnu.org/software/bash/manual/bash.html#Shell-Par...