08-25-2008
bash and ksh: variable lost in loop in bash?
Hi,
I use AIX (ksh) and Linux (bash) servers. I'm trying to do scripts to will run in both ksh and bash, and most of the time it works. But this time I don't get it in bash (I'm more familar in ksh).
The goal of my script if to read a "config file" (like "ini" file), and make various report. I really simplified my script and reproduce the problem. It seems that variable inside "while loop" are lost in bash, but not in ksh?
Here's the script:
#!/bin/bash
function read_configfile
{
typeset configfile="$1"
typeset Hostname="$2"
grep '=' $configfile | sed "s/'//g" | while read ligne; do
variable="$(echo "$ligne" | awk -F= '{print $1}')"
value="$(echo "$ligne" awk -F= '{print $2}')"
eval "$variable='$value'"
done
echo "Affectation=$Affectation"
}
read_configfile bogus.in $(hostname)
And the bogus.in file:
Affectation=Yes life is good
When run, the output is
Affectation=
So... First of all I want to understand WHY the behavior is different. Is it because the way the "pipe" are processed?
Second, I found a way to bypass this. I just put every "variable=value" in a file (echo equation >>file), and outside the loop I'm doing an eval, and it works. But I would prefer NOT to use temporary file, so if you have any suggestions...
Thanks.
Last edited by estienne; 08-25-2008 at 01:55 PM..
10 More Discussions You Might Find Interesting
1. Shell Programming and Scripting
hi
i was trying to optimize one script and i came across this problem .. i am putting some pseudo code here
$ >cat a.sh
ls | while read I
do
i=$(($i + 1))
done
echo "total no of files : "
$ >ksh a.sh
total no of files :
$ >bash a.sh
total no of files :
why is... (1 Reply)
Discussion started by: zedex
1 Replies
2. Shell Programming and Scripting
Over time i have developed a library of useful (ksh) functions which i use in most of my scripts. I use the ksh's FPATH variable to locate all these functions and use a standard environment-setting-function to always have the same environment in all my scripts.
Here is how i begin scripts:
... (3 Replies)
Discussion started by: bakunin
3 Replies
3. Shell Programming and Scripting
Hi,
I have a loop running until a variable L that is read previously in the full script. I'd like to grep some information in an input file at a line that contains the value of the loop parameter $i.
I've tried to use grep, but the problem is nothing is written in the FILE files. It seems grep... (5 Replies)
Discussion started by: DMini
5 Replies
4. UNIX for Dummies Questions & Answers
Hi all! I think someone might be able to solve my problem pretty easily.
I am trying to run a bash loop with 3 variables. I know how to do:
for var1 in `cat list1`; do for var2 in `cat list2`; do for var3 in `cat list3`; command var1 var2 > var3; done; done; done
However, this will run all... (4 Replies)
Discussion started by: torchij
4 Replies
5. Programming
Hello,
I'm trying to read the variable "pause" from a for loop without luck. The function is dependant on the outcome of the test within the loop. If i run this, pause is always 0 within the function. Any ideas?
Thanks.
pause=0
users=1
(for (( ; ; ))
do
speed=`cat speed.log`
... (7 Replies)
Discussion started by: shadyuk
7 Replies
6. Shell Programming and Scripting
I am fairly new to bash and am not sure how to resolve this:
I have a series of geographical long/lat points eg. 50/-30 listed on separate lines in a file called junk2. I have input these into an array and am then using that array in a for loop. Towards the end of the loop I create a file called... (4 Replies)
Discussion started by: lily-anne
4 Replies
7. Shell Programming and Scripting
I am not clear why the cnt variable is not increased in the script below:
#!/bin/bash
INPF=${1:-a.txt};
KWDS=${2:-lst}
cnt=0;
grep -v '^#' $KWDS | while read kwd;
do
grep -q $kwd $INPF;
if ; then
echo Found;
((cnt=cnt+1));
fi... (5 Replies)
Discussion started by: migurus
5 Replies
8. Shell Programming and Scripting
In the below for loop, I extract a variable $d which is an id that will change each time. The bash executes the problem that I am having is that p (after the done) is the path with the extracted $d. However, I can not use it in subsequent loops as it is not reconized. I have been trying to change... (3 Replies)
Discussion started by: cmccabe
3 Replies
9. UNIX for Beginners Questions & Answers
In the else of the main if condition .
else
set lnk = $(readlink -f <path> | cut -d '/' -f7)
echo "$lnk"
if ]
When I run the above on command line , the execution seems to be fine and I get the desired output. But when I try to assign it to a variable within a loop... (12 Replies)
Discussion started by: sankasu
12 Replies
10. UNIX for Beginners Questions & Answers
Cope sample1: test.sh
i=0
echo " Outside loop i = $i "
while
do
i=$(( $i + 1))
echo "Inside loop i = $i "
done
echo " Out of loop i is : $i "
When run output :
Outside loop i = 0
Inside loop i = 1
Inside loop i = 2
Inside loop i = 3
Inside loop i = 4
Inside loop i = 5
Inside... (8 Replies)
Discussion started by: Adarshreddy01
8 Replies
echo(1B) SunOS/BSD Compatibility Package Commands echo(1B)
NAME
echo - echo arguments to standard output
SYNOPSIS
/usr/ucb/echo [-n] [argument]
DESCRIPTION
echo writes its arguments, separated by BLANKs and terminated by a NEWLINE, to the standard output.
echo is useful for producing diagnostics in command files and for sending known data into a pipe, and for displaying the contents of envi-
ronment variables.
For example, you can use echo to determine how many subdirectories below the root directory (/) is your current directory, as follows:
o echo your current-working-directory's full pathname
o pipe the output through tr to translate the path's embedded slash-characters into space-characters
o pipe that output through wc -w for a count of the names in your path.
example% /usr/bin/echo "echo $PWD | tr '/' ' ' | wc -w"
See tr(1) and wc(1) for their functionality.
The shells csh(1), ksh(1), and sh(1), each have an echo built-in command, which, by default, will have precedence, and will be invoked if
the user calls echo without a full pathname. /usr/ucb/echo and csh's echo() have an -n option, but do not understand back-slashed escape
characters. sh's echo(), ksh's echo(), and /usr/bin/echo, on the other hand, understand the black-slashed escape characters, and ksh's
echo() also understands a as the audible bell character; however, these commands do not have an -n option.
OPTIONS
-n Do not add the NEWLINE to the output.
ATTRIBUTES
See attributes(5) for descriptions of the following attributes:
+-----------------------------+-----------------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+-----------------------------+-----------------------------+
|Availability |SUNWscpu |
+-----------------------------+-----------------------------+
SEE ALSO
csh(1), echo(1), ksh(1), sh(1), tr(1), wc(1), attributes(5)
NOTES
The -n option is a transition aid for BSD applications, and may not be supported in future releases.
SunOS 5.10 3 Aug 1994 echo(1B)