I have the following problem. Let´s assume that $@
contains only valid files. Variable file
contains the name of the current file (the file I'm currently "on"). Then variable element
contains data in the format file:function
.
Now, when variable element is not empty, it should be put into the array. And that's the problem. If I echo element
, it contains exactly what I want, although it is not stored in array, so for cycle doesn't print out anything.
I have written two ways I try to insert element into array, but neither works. Can you tell me, What am I doing wrong, please?
I'm using Linux Mint 16.
#!/bin/bash
nm $@ | while read line
do
pattern="`echo \"$line\" | sed -n \"s/^\(.*\):$/\1/p\"`"
if [ -n "$pattern" ]; then
file="$pattern"
fi
element="`echo \"$line\" | sed -n \"s/^U \([0-9a-zA-Z_]*\).*/$file:\1/p\"`"
if [ -n "$element" ]; then
array+=("$element")
#array[$[${#array[@]}+1]]="$element"
echo element - "$element"
fi
done
for j in "${array[@]}"
do
echo "$j"
done
Your problem is that the
while
loop runs in a subshell because it is the second command in a pipeline, so any changes made in that loop are not available after the loop exits.You have a few options. I often use
{
and}
for command grouping:In
bash
, you can also use process substitution:Also, it is better to use
$(…)
in place of back-quotes`…`
(and not just because it is hard work getting back quotes into markdown text!).Your line:
could be written:
or even:
It really helps when you need them nested. For example, to list the
lib
directory adjacent to wheregcc
is found:vs
I know which I find easier!