| From: William Park via talk <talk@gtalug.org>

| 1. You don't need quotes in variable assignments like 
|       var="$(...)"
|       var="$var1"

True.  Even if var1 has whitespace.  But the quotes are harmless.

The rule I aspire to following:
        Quote all shell variable references EXCEPT when they must not
        be quoted (rare).
It's a lot easier than knowing the very odd rules applying to
assignment and other special contexts.

Why is assignment odd?  Because, syntactically, it is a kind of word
(an ASSIGNMENT_WORD according to POSIX).

| 2. The following tests are the same.  They both tests if var is empty.
|       [ "$var"x = x ]
|       [ -z "$var" ]

I like -z

Superstitiously, I would write
        [ "x$var" = x ]
instead of
        [ "$var"x = x ]
I would otherwise worry that if $var started with, say, -, funny
things might happen.

| 3. Testing if command succeeded or failed can be done in-line.
|       if command1 | command2 | command2; then
|           ...
|       else
|           ...
|       fi

When I learned sh (long before POSIX) I think that the Bourne Shell
set the exit status of a pipeline to the exit status of the first
command.  So I'm (needlessly) nervous about what the exit status of a
pipeline is.

BASH has an option to have a pipeline fail if any component fails.
Seems useful (but not portable): -o pipefail

Speaking of useful bash options, I always turn on these two options in
my BASH scripts
        -e stop dead when a command returns an error in an untested
                context
        -u consider a reference to an undefined variable to be an
                error
These catch a lot of errors that might otherwise go unnoticed.

| 4. Case statement is usually better than if statement.  eg.
|       if [[ "$var" == glob ]]; then
|           ...
|       fi
|    vs
|       case $var in
|           glob) ... ;;
|       esac
|     Note the missing quotes in case, too.  You don't need it.

I think that [[ ]] is a BASHism.  I presume that it has advantages
over [ ] but I don't know them.

In the old days, test (AKA [ ]) wasn't built-in and so case was
faster.  This isn't true of modern shells.
---
Post to this mailing list talk@gtalug.org
Unsubscribe from this mailing list https://gtalug.org/mailman/listinfo/talk

Reply via email to