On Thu, Aug 31, 2023 at 10:38:55PM +0300, queency3 jones wrote: > i don't think that main is significant when it declared in "Bash" but even > though, > if you change the function main , to function ain the $aa should be local > , but it ain't !!
Function names being "main" or "ain" is irrelevant (the shell does not give significance to their name). The scope of the variable "aa" is global in all functions in your example. If you want a variable to be local to a function, you need to declare it as such. Note that declaring a variable as local in your "main" function will give it a scope that stretches into the called "sub" function. If you want the changes that "sub" makes to the variable be local to that function, then you need to declare it as local in "sub", like I showed. Quoting the manual: Variables local to the function may be declared with the local builtin command (local variables). Ordinarily, variables and their values are shared between the function and its caller. If a variable is declared local, the variable's visible scope is restricted to that function and its children (including the functions it calls). > > > On Wed, Aug 30, 2023 at 5:59 PM Andreas Kusalananda Kähäri < > andreas.kah...@abc.se> wrote: > > > On Wed, Aug 30, 2023 at 03:40:21PM +0300, queency3 jones wrote: > > > > > > > > From: queen...@gmail.com > > > To: bug-bash@gnu.org > > > Subject: 2 same var name in different function causing mix > > > > > > Configuration Information [Automatically generated, do not change]: > > > Machine: x86_64 > > > OS: linux-gnu > > > Compiler: gcc > > > Compilation CFLAGS: -g -O2 > > -fdebug-prefix-map=/build/bash-2bxm7h/bash-5.0=. -fstack-protector-strong > > -Wformat -Werror=format-security -Wall -Wno-parentheses -Wno-format-security > > > uname output: Linux debian 4.19.0-25-amd64 #1 SMP Debian 4.19.289-2 > > (2023-08-08) x86_64 GNU/Linux > > > Machine Type: x86_64-pc-linux-gnu > > > > > > Bash Version: 5.0 > > > Patch Level: 3 > > > Release Status: release > > > > > > Description: > > > > > > function sub { aa=8;return_value=$aa; } > > > function sub { aa=8; } > > > > > > function main { aa=3;sub;aa=$(($aa+1));printf "$aa\n"; } > > > > > > > > > calling main will print 9 instead of 4 > > > > > > > > > > Not a bug. > > > > The code outputs "9" because the scope of the variable "aa" is global > > (once it has been created in "main"). The second function "sub" will > > therefore modify the value of the variable "aa" in the global scope. > > The change in the variabel's value will be visible in "main" after the > > call to "sub". > > > > To make the variable local to the "sub" function, use the "local" > > keyword: > > > > function sub { local aa=8; } > > > > This will create a local variable "aa" in the function "sub" that will > > not be visible outside of the function. In particular, it will not > > overwrite the global variable "aa" in "main" and the value of "aa" in > > "main" will remain unchanged (until you increment it from "3" to "4"). > > > > On an unrelated note, you sohuld be printing the value using a static > > formatting string, like so: > > > > printf '%s\n' "$aa" > > > > This avoids interpreting the value of the variable as a printf formatting > > string. > > > > -- > > Andreas (Kusalananda) Kähäri > > SciLifeLab, NBIS, ICM > > Uppsala University, Sweden > > > > . > > -- Andreas (Kusalananda) Kähäri SciLifeLab, NBIS, ICM Uppsala University, Sweden .