sysrc -- a sysctl(8)-like utility for managing /etc/rc.conf et. al.

Garance A Drosihn drosih at rpi.edu
Mon Oct 11 00:59:57 UTC 2010


On 10/10/10 7:09 PM, Devin Teske wrote:
> On Oct 9, 2010, at 10:25 PM, Julian Elischer wrote:
>    
>>
>> For what it matters, I'v enever found the [ "x$foo" = "x" ] construct to be useful.
>> the quoting seems to work for everything I've ever worked on.
>>      

There have been times where I had scripts which could get errors unless 
"x$foo" was used, but it's been more than 10 years since I last hit that 
situation. Of course, ever since I did hit it, I tend to write my 'test' 
parameters in ways which avoid the problem. It might have only been when 
checking if the variable was set to anything. Eg, using:

if [ "$foo" ] ; then ....

instead of:

if [ -n "$foo" ] ; then ...

Or it might have been when combining multiple checks in a single 'test' 
(using -a's, etc). However, I'm not going to try to dream up a 
pathological example of that right now.

> I agree... I think that the "x" syntax came around for when people were using non-quoted syntax... for example...
>
> [ x$foo = x ]
>
> is still very useful in that it prevents the error when $foo expands to "-e".
>    
The non-quoted example is dangerous in the case where $foo has multiple 
words in it. The "x" does not save you from that problem. I have a 
'list_args' script which just lists out the parameters it is called with:

# Test="this is a multi-word test"
# list_args x$Test

list_args at 19:22:27 Oct 10: $# = 5
ARG[000] l=005: 'xthis'
ARG[001] l=002: 'is'
ARG[002] l=001: 'a'
ARG[003] l=010: 'multi-word'
ARG[004] l=004: 'test'

> However, enclosing the argument (as the 'x$foo' portion is really just the first argument to the '[' built-in) in quotes:
>
> [ "$foo" = x ]
>
> makes it so that the expansion is taken as:
>
> [ "-n" = x ]
>
> rather than:
>
> [ -n = x ]
>
> The former not causing an error, while the latter does.
>    
The latter does not cause an error. Try it:

# [ "-n" = x ] ; echo $?
1

# [ -e = "no" ] ; echo $?
1

# [ -e = -n ] ; echo $?
1

> Quite functionally, at a C-level, if you have your array, ...
>
> argv[0] = "[\0";
> argv[1] = "\"-n\"\0"; /* quoted syntax */
> argv[2] = "=\0";
> argv[3] = "x\0";
>
> and
>
> argv[0] = "[\0";
> argv[1] = "-n\0"; /* non-quoted syntax */
> argv[2] = "=\0";
> argv[3] = "x\0";
>
>    
You won't see the double-quotes in the C program. The shell processes 
single and double quotes, and passes the result to the C program which 
is running. It might be different for built-in functions, but /bin/test 
would never see the double-quotes if they were used. And since the 
built-in function has to work the same as standalone function, I doubt 
the built-in would be any different.

# list_args "-n"

list_args at 19:36:15 Oct 10: $# = 1
ARG[000] l=002: '-n'
# list_args -n

list_args at 19:36:22 Oct 10: $# = 1
ARG[000] l=002: '-n'

(note that the single-quotes you see there are printed by the list_args 
script itself for display purposes).

/disclaimer: I think this is the first post that I've made with the new 
"open-source edition" of Eudora, and I have no idea if this will be 
formatted the way I'm expecting it be!/

-- 
Garance Alistair Drosehn = drosih at rpi.edu
Senior Systems Programmer or gad at FreeBSD.org
Rensselaer Polytechnic Institute; Troy, NY; USA



More information about the freebsd-hackers mailing list