Files
Aliaksei Budavei 23c77d8ec8 runtime(sh): Do not conflate empty array and function declarations in Bash
Although the "=" character is permitted in function names,
a construct that parses as a variable assignment is
preferred to it parsing as a function declaration.  See the
updated test file "sh_functions_bash.sh" for details.

fixes:  #20183
closes: #20205

Co-authored-by: Doug Kearns <dougkearns@gmail.com>
Signed-off-by: Aliaksei Budavei <0x000c70@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
2026-05-17 18:06:22 +00:00

97 lines
1.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# VIM_TEST_SETUP setlocal fen fdc=2 fdl=8 fdm=syntax
# VIM_TEST_SETUP let g:sh_fold_enabled = 1 + 2 + 4
typeset -i n=0
doosie() ((n+=1)); doosie
donee() [[ -n $# ]]; donee
thence()
until :
do
:
done
thence
whiles() while false; do :; done; whiles
elsewhere() if :
then :; fi; elsewhere
selector() select x in 1 2; do
break
done
selector 0</dev/null 2>/dev/null || :
cased() case "$#" in *) :;; esac; cased
fore()
for x in 1 2
do
:
done
fore
iffy() for ((;;))
do
break
done
iffy
if :; then
function !?#()
(
function @α! {
echo "$1"
}
@α! "$1"
)
eval !?\# "\"$1\""
fi
namespace ()
{ echo $#;
}; namespace $@
# Whether "=" belongs to a name or delimits a name depends on whether
# the reserved word "function" is present, if so, then "=" is part of
# the function name; else, "=" delimits the name of a variable when this
# name is given in alphanumeric characters and "_"s before the leftmost
# "="; otherwise, "=" is part of the function name when this name has
# one or more supported NON-alphanumeric (or "_") characters before "=".
xs=()
(
echo $(( 1 + ${#xs[*]} ))
xs=()
{
echo $(( 2 + ${#xs[*]} ))
xs=()
if :; then echo $(( 3 + ${#xs[*]} )); fi
}
)
=() (
=id=() {
===()
if :; then echo $*; fi; === $*
}; =id= $*
); id= = = =
function f=() (
function f=f {
function f=f=
if :; then echo $*; fi; f\=f\= $*
}; f\=f $*
); f= f\= f= f=
# Parens are not escaped, hence this is invalid variable assignment.
f=f()
{
f=f=()
(
f=f=f()
if :; then :; fi
)
}