Ответ 1
Ваша проблема заключается в том, что цикл while
выполняется в подоболочке, потому что это вторая команда в конвейере, поэтому любые изменения, сделанные в этом цикле, недоступны после выхода цикла.
У вас есть несколько вариантов. Я часто использую {
и }
для группирование команд:
nm "[email protected]" |
{
while read line
do
…
done
for j in "${array[@]}"
do
echo "$j"
done
}
В bash
вы также можете использовать замещение процесса:
while read line
do
…
done < <(nm "[email protected]")
Кроме того, лучше использовать $(…)
вместо обратных кавычек `…`
(а не только потому, что это тяжелая работа, возвращающая цитаты в текст уценки!).
Ваша строка:
element="`echo \"$line\" | sed -n \"s/^U \([0-9a-zA-Z_]*\).*/$file:\1/p\"`"
можно написать:
element="$(echo "$line" | sed -n "s/^U \([0-9a-zA-Z_]*\).*/$file:\1/p")"
или даже:
element=$(echo "$line" | sed -n "s/^U \([0-9a-zA-Z_]*\).*/$file:\1/p")
Это действительно помогает, когда вы в них нуждаетесь. Например, чтобы найти каталог lib
рядом с тем, где gcc
найден:
ls -l $(dirname $(dirname $(which gcc)))/lib
против
ls -l `dirname \`dirname \\\`which gcc\\\`\``/lib
Я знаю, что мне легче!