[CentOS] bash variable expansion moment

Stephen Harris lists at spuddy.org
Sun Nov 15 19:22:45 UTC 2009


On Sun, Nov 15, 2009 at 01:50:30PM -0500, ken wrote:
> The problem is that $LINENO is evaluated in the function definition, and
> not when called.  So I'm thinking to change "$LINENO" in the function

No it's not.  Variables are _not_ evaluated when the function is defined;
they're evaluated at execution.  otherwise simple things like

  y=1
  x()
  {
    echo $y
  }
  y=10
  x
would not work.

You can show this, simply, with "typeset -f"
eg
  x()
  {
    echo Line is $LINENO
  }
  typeset -f

The result is
  x ()
  {
      echo Line is $LINENO
  }

Note that the variable has _not_ been evaluated; it's still there in the
function definition.

Your problem is that LINENO is a special variable that changes value as
the program executes.

As per the manpage:
       LINENO Each  time this parameter is referenced, the shell substitutes a
              decimal number representing the current sequential  line  number
              (starting  with  1)  within a script or function.

it's clear that when you enter a function it is reset to 1.  Thus:
  function y
  {
    echo in y, LINENO=$LINENO
  }
  echo LINENO=$LINENO
  y
results in
  LINENO=5
  in y, LINENO=3
because the echo statement is on the third line of the function.

You can not use $LINENO inside a function and expect it to represent the
line where the function is called.

So, again, reading the manpage, you need to look at the array BASH_LINENO;
in particular BASH_LINENO[0] is the line number of the line that calls
your function.

So...
  function x
  {
    echo We were called from line ${BASH_LINENO[0]}
  }

  echo LINENO=$LINENO before the call
  x
  echo LINENO=$LINENO after the call
may result in
  LINENO=6 before the call
  We were called from line 7
  LINENO=8 after the call

Is this what you wanted to do?

-- 

rgds
Stephen


More information about the CentOS mailing list