Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Jun 2013 14:16:50 -0500
From:      Tim Daneliuk <tundra@tundraware.com>
To:        dteske@freebsd.org
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Bourne shell "if" syntax
Message-ID:  <51B62622.1070201@tundraware.com>
In-Reply-To: <121b01ce660e$2abae5f0$8030b1d0$@freebsd.org>
References:  <51b620a6.42f.2b6a6400.5605dcf0@go2france.com> <121701ce660c$9a9aa5b0$cfcff110$@freebsd.org> <51B62389.5000500@tundraware.com> <121b01ce660e$2abae5f0$8030b1d0$@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 06/10/2013 02:10 PM, dteske@freebsd.org wrote:
>
>
>> -----Original Message-----
>> From: owner-freebsd-questions@freebsd.org [mailto:owner-freebsd-
>> questions@freebsd.org] On Behalf Of Tim Daneliuk
>> Sent: Monday, June 10, 2013 12:06 PM
>> To: freebsd-questions@freebsd.org
>> Subject: Re: Bourne shell "if" syntax
>>
>> On 06/10/2013 01:59 PM, dteske@freebsd.org wrote:
>>>
>>>
>>>> -----Original Message-----
>>>> From: owner-freebsd-questions@freebsd.org [mailto:owner-freebsd-
>>>> questions@freebsd.org] On Behalf Of lconrad@go2france.com
>>>> Sent: Monday, June 10, 2013 11:53 AM
>>>> To: freebsd-questions@freebsd.org
>>>> Subject: Bourne shell "if" syntax
>>>>
>>>>
>>>>
>>>> script fragment:
>>>>
>>>> PTR=`dig @some.dns +short +norec -x a.b.c.d`
>>>>
>>>> echo "$PTR"
>>>>
>>>> if  [  "$PTR"  ==  ""  ]  ;  then
>>>>
>>>
>>> if [ "$PTR" = "" ]; then
>>>
>>> or
>>>
>>> if [ -z "$PTR" ]; then
>>>
>>> or
>>>
>>> if [ "$PTR" ]; then
>>>
>>> but _NOT_
>>>
>>> if [ "$PTR" == "" ]; then
>>>
>>
>>
>> I work across a bunch of different OSs and shells of many vintages.  As I
> recall,
>> the -z argument has problems of portability on older/broken shells and/or
>> is not available in all environments (I cannot recall which at the moment).
> So
>> I achieve the same results by using a character sentinel that guarantees that
> the
>> comparison always works:
>>
>>     f  [  _"$PTR"  ==  _  ]  ;  then
>>
>
> Character sentinels are not required.
>
> FreeBSD's sh(1) knows (because "[" is a built-in) that when you quote a
> parameter, that it is not (even if the value begins with "-") not an operator.
>


That wasn't really my point.  I use sentinels because in the face of an
empty string this:

    if [ $PTR = "" ]

Actually evaluates to:

    if [ = "" ]

Which throws an error.  The character sentinel avoids this without having to
use -z, which as I said, I've had problems with not being too portable across
older machinery.


> All work as expected. It matters not the value of $foo. sh(1) in FreeBSD knows
> because of the double-quotes that it is not an operator.
>
> Furthermore...
>
> "==" is not the right operator. It's "=".
>
> Portability would surely be compromised if you were using "==" (which doesn't
> work on FreeBSD; or many other OSes I gather from experience).
>

Ooops, I did catch that and you're quite right.
-- 
-----------------------------------------------------------------------
Tim Daneliuk



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51B62622.1070201>