Re: [PATCH] Supplant the "while case ... break ;; esac" idiom
From: David Kastrup <hidden>
Date: 2016-06-15 22:43:36
Pierre Habouzit [off-list ref] writes:
On Mon, Sep 24, 2007 at 07:57:31AM +0000, David Kastrup wrote:quoted
"David Symonds" [off-list ref] writes:quoted
On 24/09/2007, David Kastrup [off-list ref] wrote:quoted
Mike Hommey [off-list ref] writes:quoted
On Sun, Sep 23, 2007 at 10:42:08PM +0200, David Kastrup wrote:quoted
-while case $# in 0) break ;; esac +while test $# != 0Wouldn'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