Skip to content

Comment on Writing Robust Bash Shell Scriptsparent

Comments

    $ cat foo.sh
    #!/bin/bash
    echo $BASH_VERSION
    unset filename
    if [[ $filename == "foo" ]];
    $ ./foo.sh
    4.1.2(1)-release
    ./foo.sh: line 5: syntax error: unexpected end of file
If $filename evaluates to an empty string, then the last line of code becomes
    if [[ == "foo" ]];
Similarly, if $filename evaluates to a b c, then the last line of code becomes
    if [[ a b c == "foo" ]];
The bash interpreter has problems with both of these.

No, that is just wrong. In double-brackets, bash will handle expansion and testing of unset variables and variables with spaces just fine, because word splitting and pathname expansion are not performed in double braces -- they are shell syntax, as opposed to single brackets, which are commands. Your syntax error happened because you don't have a fi matching that if.

As a counterexample:

  (echo $BASH_VERSION; 
  foo=foo; [[ $foo = foo ]] && echo $foo; 
  foo="1 2 3"; [[ $foo = "1 2 3" ]] && echo $foo; 
  foo=''; echo ${foo?"No foo for you"}; 
  unset foo; echo ${foo?"No foo for you"})
  4.2.10(1)-release
  foo
  1 2 3
  
  bash: foo: No foo for you
That last one is one of the few ways you can tell whether a variable is unset or merely set to an empty string.

lrn2bash.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.