微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 – 无法在bash中将数组添加到数组中

我有以下问题.我们假设$@只包含有效文件.变量文件包含当前文件名称(我当前“打开”的文件).然后,变量元素包含格式为file:function的数据.

现在,当变量元素不为空时,应将其放入数组中.这就是问题所在.如果我回显元素,它包含我想要的,虽然它没有存储在数组中,所以对于循环不打印任何东西.

我写了两种尝试将元素插入数组的方法,但都不起作用.你能告诉我,我做错了什么,拜托?

我正在使用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

解决方法:

您的问题是while循环在子shell中运行,因为它是管道中的第二个命令,因此在循环退出后,该循环中所做的任何更改都不可用.

你有几个选择.我经常使用{和}表示command grouping

nm "$@" |
{
while read line
do
    …
done
for j in "${array[@]}"
do
    echo "$j"
done
}

在bash中,您还可以使用process substitution

while read line
do
    …
done < <(nm "$@")

另外,最好使用$(…)代替后引号`…`(而不仅仅是因为将引号引回到markdown文本是一项艰苦的工作!).

你的路线:

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")

当你需要它们嵌套时,这真的很有帮助.例如,要列出与找到gcc的位置相邻的lib目录:

ls -l $(dirname $(dirname $(which gcc)))/lib

VS

ls -l `dirname \`dirname \\\`which gcc\\\`\``/lib

我知道哪个更容易找到!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐