bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: setarray[unsetkey] doesn't trigger nounset in arithmetic context


From: Martin D Kealey
Subject: Re: setarray[unsetkey] doesn't trigger nounset in arithmetic context
Date: Mon, 22 May 2023 07:01:18 +1000

(I assume this is a continuation of the discussion in #bash on Libera.chat
yesterday?)

The primary use of `set -u` is to detect misspelled variable names, and
misspelled keys for associative arrays seems like a reasonable extension of
that, if you assume that they're in some sense a fixed list, like the fixed
fields in a C struct.

However, Bash's associative arrays more closely resemble Perl hashes, PHP
arrays, Python dicts, JS objects, etc, where "missing" entities are normal
and expectable. At least some - maybe most - of the time they fulfill roles
more similar to these open dynamic structures than to traditional fixed
structs, and treating "unset" as a fatal error is not the experience that
programmers have using other scripting languages, and is therefore, I would
argue, not something that should be added to the Shell, and certainly not
as a quiet change to the existing `set -u`.

This leads to the conclusion that the fail-if-unset behaviour should be
specified on a per-array basis, which means it should be part of `declare`
and `local` rather than a global through `set` or `shopt`.

If we're heading down this route I have a bunch of other things that
overdue to be fixed, including:

1. ${array[@]:start:count} can under some circumstances return elements
with indeces >= start+count, completely contravening expectations from
other programming languages. There should be a `declare` or `local` option
to fix that, and/or a shopt setting.
2. ${#array[@]} gives the number of elements rather than the last index
(minus 1). Being able to declare an array as non-sparse (so that all gaps
"exist" with some default value) would fix this.

-Martin


reply via email to

[Prev in Thread] Current Thread [Next in Thread]