When scripting, which is better?

Started by Justin Cliftover 24 years ago6 messages
#1Justin Clift
justin@postgresql.org

Hi all,

Reading through the script files again, there seems to be several
different methods of doing the same thing :

i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ];
then

or

if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then

if [ x"$foo" = x"" ]; then

or

if [ "$op" = "" ]; then

or

if [ "$foo" ]; then

--
"My grandfather once told me that there are two kinds of people: those
who work and those who take the credit. He told me to try to be in the
first group; there was less competition there."
- Indira Gandhi

#2Ken Hirsch
kenhirsch@myself.com
In reply to: Justin Clift (#1)
Re: When scripting, which is better?

Justin Clift wrote:

if [ x"$foo" = x"" ]; then

This is the safest way. It prevents problems when $foo begins with with a
"-"

I don't know about your first question, though.

#3Adrian Phillips
adrianp@powertech.no
In reply to: Justin Clift (#1)
Re: When scripting, which is better?

"Justin" == Justin Clift <justin@postgresql.org> writes:

Justin> if [ x"$foo" = x"" ]; then

Justin> or

Justin> if [ "$op" = "" ]; then

Justin> or

Justin> if [ "$foo" ]; then

I'm not the slightest bit a shell expert, but why not :-

if [ -z "$foo" ]; then

Is this POSIX/SUS2/whatever ?

Sincerely,

Adrian Phillips

--
Your mouse has moved.
Windows NT must be restarted for the change to take effect.
Reboot now? [OK]

#4Bruce Momjian
pgman@candle.pha.pa.us
In reply to: Justin Clift (#1)
Re: When scripting, which is better?

Hi all,

Reading through the script files again, there seems to be several
different methods of doing the same thing :

i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ];
then

The above semicolon is useless. Actually, I have never see this. The
normal way is:

if [ -x "$self_path/postmaster" -a -x "$self_path/psql" ]

or

if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then

I usually do:

if [ ... ]
then

Pretty simple.

if [ x"$foo" = x"" ]; then

or

if [ "$op" = "" ]; then

This is done if you think $op may have a leading dash.

or

if [ "$foo" ]; then

This tests whether "$foo" is not equal to "".

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#5Justin Clift
justin@postgresql.org
In reply to: Bruce Momjian (#4)
Re: When scripting, which is better?

Sorry guys,

I didn't realise I actually sent this, it was part of an email I was
putting together to achieve consistency in the scripts, but I thought I
cancelled it when it got late in the morning.

My apologies.

Regards and best wishes,

Justin Clift

Bruce Momjian wrote:

Hi all,

Reading through the script files again, there seems to be several
different methods of doing the same thing :

i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ];
then

The above semicolon is useless. Actually, I have never see this. The
normal way is:

if [ -x "$self_path/postmaster" -a -x "$self_path/psql" ]

or

if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then

I usually do:

if [ ... ]
then

Pretty simple.

if [ x"$foo" = x"" ]; then

or

if [ "$op" = "" ]; then

This is done if you think $op may have a leading dash.

or

if [ "$foo" ]; then

This tests whether "$foo" is not equal to "".

--
Bruce Momjian                        |  http://candle.pha.pa.us
pgman@candle.pha.pa.us               |  (610) 853-3000
+  If your life is a hard drive,     |  830 Blythe Avenue
+  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

--
"My grandfather once told me that there are two kinds of people: those
who work and those who take the credit. He told me to try to be in the
first group; there was less competition there."
- Indira Gandhi

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Justin Clift (#1)
Re: When scripting, which is better?

Justin Clift writes:

i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ];
then

or

if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then

I don't think the second one is a valid expression. ;-)

Maybe you were wondering about [[ ]] vs [] -- In Autoconf [] are the quote
characters so you have to double-quote, sort of. It's better to use
'test' in that case because m4 quoting can be tricky. I prefer test over
[] in general because it is more consistent and slightly clearer.

if [ x"$foo" = x"" ]; then

Maximum safety for the case where $foo starts with a dash. Yes, that
means all comparisons should really be done that way. No, I don't think
we should do it in all cases if we know what $foo can contain, because
that makes code *really* unreadable.

or

if [ "$op" = "" ]; then

or

if [ "$foo" ]; then

These two are equivalent but the second one is arguably less clear.

--
Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter