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:
nm "$@" |
{
while read line
do
…
done
for j in "${array[@]}"
do
echo "$j"
done
}
In bash
, you can also use process substitution:
while read line
do
…
done < <(nm "$@")
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:
element="`echo "$line" | sed -n "s/^U ([0-9a-zA-Z_]*).*/$file:1/p"`"
could be written:
element="$(echo "$line" | sed -n "s/^U ([0-9a-zA-Z_]*).*/$file:1/p")"
or even:
element=$(echo "$line" | sed -n "s/^U ([0-9a-zA-Z_]*).*/$file:1/p")
It really helps when you need them nested. For example, to list the lib
directory adjacent to where gcc
is found:
ls -l $(dirname $(dirname $(which gcc)))/lib
vs
ls -l `dirname `dirname \`which gcc\```/lib
I know which I find easier!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…