global variable not holding its value?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting global variable not holding its value?
# 1  
Old 12-16-2008
global variable not holding its value?

dear there,

this kept me awake last night, the variable ${TO} in the following script doesn't seem to hold its value.

I have a file ./filelist, which lists all files of interests. I group them by keywords in the filename, and would like to count total number of lines in each group.
---------------------------------------
#!/bin/bash -xv

TO=1

for i in key1 key2;do
TO=0
grep $i ./filelist |\
while read FILE;do
let TO=$((${TO}+`cat $FILE|wc -l`))
echo "total number of lines in file whose name containing $i increased to ${TO}"
done
echo "total number of lines in file whose name containing $i finally
equal to ${TO}"
done
------------------------------------
the content of ./filelist:
key1_week1.csv
key2_week2.csv
key1_week3.csv
key2_week4.csv
--------------------------------
note: the number of lines in each file listed above is 3, 2, 5, 9
--------------------------------

the output is wierd since the final total is wrong while the running total are right:
number of lines in file whose name containing key1 increased to 3
number of lines in file whose name containing key1 increased to 8
total number of lines in file whose name containing key1 is 0
number of lines in file whose name containing key2 increased to 2
number of lines in file whose name containing key2 increased to 11
total number of lines in file whose name containing key2 is 0

So why ${TO} holds its value after the while loop? isn't it a global variable? This puzzled me!

Thanks for your patience!

Sincerely Yours,
Michael
# 2  
Old 12-16-2008
If you run the for loop in a subshell, you can make that code work:

Code:
#! /bin/bash
TEST=1
(
 echo $TEST
 for i in 2 3 4 ; do
   TEST=$i
   echo $TEST
 done
)
echo $TEST

More info on variable scope here:
Subshells

Last edited by Autocross.US; 12-16-2008 at 02:41 PM.. Reason: clarity
# 3  
Old 12-16-2008
dear jimbalaya, it seems doing the opposite thing. What I want is to let ${TO} to hold values after the while loop. It seems that the subshell prevents that. Since I didn;t use subshell, I expect the outer variable ${TO} will be changed inside the while loop. however it didn't, that's where the problem it.
# 4  
Old 12-16-2008
Dear jimbalaya, I just added "echo $$" to see which shell I am in, it turned out that I am in the same shell all the time. however the value of $TO is not updated inside the while loop!
---------------------
#!/bin/bash

TO=1

for i in key1 key2;do
TO=0
grep $i ./filelist |\
while read FILE;do
let TO=$((${TO}+`cat $FILE|wc -l`))
echo "To value increased to ${TO}"
echo "we are in the shell $$"
done
echo "we are in the shell $$"
echo "TO value is ${TO}"
done
--------------------------------
output
-------------------------------
To value increased to 3
we are in the shell 12851
To value increased to 8
we are in the shell 12851
we are in the shell 12851
TO value is 0
To value increased to 2
we are in the shell 12851
To value increased to 11
we are in the shell 12851
we are in the shell 12851
TO value is 0
# 5  
Old 12-16-2008
Sorry, looking at the code i thought that's what you were trying to do.

Can you give an example of what the expected output should be?
# 6  
Old 12-16-2008
Commands after a pipe also run in a subshell.
Use a for loop:

Code:
for FILE in "`grep $i ./filelist`"; do

instead of:

Code:
grep $i ./filelist |\
while read FILE;do

Regards
# 7  
Old 12-16-2008
Ok, appears that the while loop using a pipe was also a subshell, so that was the problem.

Code:
#! /bin/bash
TO=1

for i in key1 key2 ; do
  TO=0

  for FILE in $(grep $i ./filelist); do
    let TO=$(( ${TO} + `cat $FILE|wc -l` ))
    echo "total number of lines in file whose name containing $i increased to ${TO}"
  done


  echo "total number of lines in file whose name containing $i finally equal to ${TO}"
done

this prints:
Code:
total number of lines in file whose name containing key1 increased to 3
total number of lines in file whose name containing key1 increased to 8
total number of lines in file whose name containing key1 finally equal to 8
total number of lines in file whose name containing key2 increased to 2
total number of lines in file whose name containing key2 increased to 11
total number of lines in file whose name containing key2 finally equal to 11


Edit: looks like someone found the fix before me.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Global Variable

Hi, I have created a variable say today at the begin having 123 as its value and inside a for loop it gets resolved to some value say 150 in its first iteration. How can I use this value 150 ( 1st iteration's ) outside the scope of for loop ?. In the same way I wanted to use all iteration's... (1 Reply)
Discussion started by: penqueen
1 Replies

2. Shell Programming and Scripting

Global variable value

Hi All, Im new to shell scripting. I am running EgA.sh and setting one global variable XYZ=0 . Also calling another EgB.sh from EgA.sh, changing the value of XYZ=10 but after executing EgB.sh, value of XYZ is still 0. Im expecting it to be 10. Anyone for help. Thanks in Advance. :) (5 Replies)
Discussion started by: paliwal
5 Replies

3. Shell Programming and Scripting

Subtract days from a variable holding date

Hi, could someone help on this.. I have a date in variable procdate="05/30/2009" I would want to Subtract it with 3 or 4 (2 Replies)
Discussion started by: infernalhell
2 Replies

4. Shell Programming and Scripting

Help with Global Variable

Hi Guyz, I have a requirement like, i have to run a script every hour to count the number of errors encountered. At the end of the day, i need to send them the total number of errors, that have ocurred the entire day. For eg. if 10 errors occurred for starting 1 hr, 5 for next 1 hr, so on.... (1 Reply)
Discussion started by: DTechBuddy
1 Replies

5. Shell Programming and Scripting

[BASH] Holding a variable unto other scripts.

Ex: Script 1 has pID=333. I want to take pID to Script 2 so I can retrive 333. How can I do this? (3 Replies)
Discussion started by: Yakuzan
3 Replies

6. Shell Programming and Scripting

Global variable

I have written a shell scritp in which i am using a variable which is declared before a while loop and i am updaitng the variable in while loop and want to use its updated value outside the loop. I am not able to do so, b'coz the scope of the variable is limited to the while loop only and when i am... (5 Replies)
Discussion started by: deepanshu
5 Replies

7. Shell Programming and Scripting

global variable not being set

In ksh I thought a global variable was any variable in a script or function that did not have the typeset command. I have a global in my calling script which I increment in a function, but the value does not change in the calling script. Here is the code: function f_open_log { typeset -r... (5 Replies)
Discussion started by: robotball
5 Replies

8. Shell Programming and Scripting

global variable in awk

I wrote a awk script file and define some global variables after BEGIN option: BEGIN { cell = ""; alarm = "";} when i run the command: awk -f awk_script inputfile The results are as expected. But when I put awk script into a shell script. Global variables couldn't be understand. I don't... (1 Reply)
Discussion started by: anhtt
1 Replies

9. Shell Programming and Scripting

Global Variable in a script?

How to create a Global variable within a script file. say i want a varaible called LOGFILE to be used within all the script. how to do that? (2 Replies)
Discussion started by: skyineyes
2 Replies

10. Shell Programming and Scripting

Global variable becomes local

I have encountered a very weird behavior of a global variable in Korn Shell in AIX: A function f1 in my script pipes the output of the function f2 to a program. A variable defined as global using typeset gets its value in f2. That value is not seen in f1. If I remove the pipe ksh recognizes the... (2 Replies)
Discussion started by: odashe318
2 Replies
Login or Register to Ask a Question