yes ! the local declaration solved my problem. tnx very much . On Thu, Aug 31, 2023 at 10:51 PM Andreas Kusalananda Kähäri < andreas.kah...@abc.se> wrote:
> 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 > > . >