Re: [PATCH] Supplant the "while case ... break ;; esac" idiom
- From
David Kastrup <dak@gnu.org>
- Date
- Sep 24, 2007, 08:29 UTC
- Message-ID
- <867imgwjne.fsf@lola.quinscape.zz>
- In-Reply-To
- <20070924080134.GA9112@artemis.corp>
Pierre Habouzit <madcoder@debian.org> writes:
Show 22 quoted lines
> On Mon, Sep 24, 2007 at 07:57:31AM +0000, David Kastrup wrote: >> "David Symonds" <dsymonds@gmail.com> writes: >> >> > On 24/09/2007, David Kastrup <dak@gnu.org> wrote: >> >> Mike Hommey <mh@glandium.org> writes: >> >> >> >> > On Sun, Sep 23, 2007 at 10:42:08PM +0200, David Kastrup wrote: >> >> >> -while case $# in 0) break ;; esac >> >> >> +while test $# != 0 >> >> > >> >> > Wouldn't -ne be better ? >> >> >> >> Why? >> > >> > Because -ne does a numeric comparison, != does a string comparison, >> > and it's a numeric comparison happening, semantically speaking. >> >> I don't see the point in converting $# and 0 into numbers before >> comparing them. "!=" is quite more readable, and the old code also >> compared the strings. > > Fwiw $# already is a number.
It isn't.
> Hence test $# -ne 0 is definitely a better test.
/* TEST/[ builtin. */
int
test_builtin (list)
WORD_LIST *list;
{
char **argv;
int argc, result; /* We let Matthew Bradburn and Kevin Braunsdorf's code do the
actual test command. So turn the list of args into an array
of strings, since that is what their code wants. */
if (list == 0)
{
if (this_command_name[0] == '[' && !this_command_name[1])
{
builtin_error ("missing `]'");
return (EX_BADUSAGE);
} return (EXECUTION_FAILURE);
}argv = make_builtin_argv (list, &argc); result = test_command (argc, argv); free ((char *)argv);
return (result); }
> $# != 0 would yield sth like (strcmp(sprintf("%d", argc), "0"))
> $# -ne 0 would yield sth like (argc != atoi("0")).
>
> Not that it matters much, but the latter looks better to me.Not to me. The code does not support your argument, and all $x expansions certainly are strings, according to manual and usage. I will rework the patch this evening in order to get a commit message more placable to Junio, and I will at his request remove all of the (redundant) quoting. But removing quoting from $# does not turn it into a number: it remains the same string '0'. If someone else feels he should replace all "=" and "!=" tests for "numeric" comparisons with the unreadable numeric tests, he can go ahead proposing a separate patch that should not just cover $#.
You can have bash declare numeric variables, but even they are strings (they just auto-evaluate on assignment):
declare -i nonsense nonsense="3+$(echo 4)" echo "$nonsense"
gives 7, even though everything has been "strings" here.
-- David Kastrup