我有以下问题。假设$@
只包含有效文件。变量file
包含当前文件的名称(我当前正在使用的文件)。然后变量element
以file:function
的格式包含数据。
现在,当变量element
不为空时,它应该被放入数组中。这就是问题所在。如果我输出element
,它包含我想要的内容,但它没有存储在数组中,因此循环不会打印任何东西。
我已经尝试了两种方式来将element
插入数组,但都无法成功。你能告诉我,我做错了什么吗?
我正在使用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
$(...)
而不是反引号。 - Jonathan Leffler-r
或-R
,如果我没记错的话)。这将节省您大部分正在进行的操作工作。 - Jonathan Lefflerset -vx
(或简化输出)的shell跟踪调试功能。您将看到变量如何被评估,然后通常很容易修复。此外,加入90年代,停止使用反引号进行命令替换。var = $(cmd_produces_output)
不是100%可移植的,但更容易阅读和嵌套。最后,在sed命令中仅在需要cmd内部的变量扩展时使用双引号。通常使用单引号,然后避免必须转义它们。祝你好运。 - shellterarray
的值,所以对于接下来的for
循环而言,它是未定义的。 - chepnernm
的输出格式和选项因系统而异。我在我的答案中添加了关于$(…)
和反引号的解释。请注意,在评论中有效的 MarkDown 在答案中无效(`…`
是与答案中有效的相同字符序列;但在这里不起作用)。 - Jonathan Leffler