Convert Bash to POSIX shell

1. Always use ShellCheck

2. -o pipefail is undefined

Remove it

3. echo flags are undefined

Probably easiest to remove ANSI codes.

4. &>/dev/null is a Bash-ism

Replace with >/dev/null 2>&1.

5. function keyword does not exist

Replace function NAME { } with NAME() { }.

6. [[ is a Bash test

Replace [[ ... ]] with [ ... ].

7. Arrays don't exist

Associative arrays can be approximated with careful use of eval.

Define a variable with an array name as a prefix, and the key as a suffix:

NAME_KEY='VALUE'

It is convenient to have a function that converts strings to identifiers:

# identifier STR
# Replace characters that are not valid in an identifier with underscores.
identifier() {
  echo "$1" | tr -C '[:alnum:]_\n' '_'
}

Define a function that retrieves a key KEY from an array ARRAY:

# aget ARRAY KEY
# Get the value of KEY from associative array ARRAY.
# Characters that are not valid in an identifier are replaced with underscores.
aget() {
  eval echo '$'"$(identifier "$1")_$(identifier "$2")"
}

Use the aget function as in the following:

aget NAME KEY

Producing the following output:

VALUE

8. No local keyword

Remove them and be careful with naming.

9. No HERESTRINGs

Replace <<< with a HEREDOC:

x="variable"
cat <<POSIX_HERESTRING
$x
POSIX_HERESTRING