Pierre Habouzit <madcoder@xxxxxxxxxx> writes: > On Mon, Sep 24, 2007 at 07:57:31AM +0000, David Kastrup wrote: >> "David Symonds" <dsymonds@xxxxxxxxx> writes: >> >> > On 24/09/2007, David Kastrup <dak@xxxxxxx> wrote: >> >> Mike Hommey <mh@xxxxxxxxxxxx> 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 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html