Bash将数组名称设置为变量值

时间:2014-07-09 18:13:40

标签: bash

我在尝试设置和填充数组时遇到问题,该数组的名称应该是另一个变量的值...任何人都可以帮忙吗?

        mainTID=${pidArray[$pidCounter]}
        tempThreadIDs=`ps -eL | grep ${mainTID} | awk '{ if ( $2 != '$mainTID' ) print $2}'`

        $mainTID=( $tempThreadIDs )

mainTID是一个整数,我想调用数组,无论该整数是什么,然后使用名为'tempThreadIDs'的列表填充它

我考虑过使用eval,但我确实需要保持开销,我无法让它正常工作......然后我试图先声明数组,但是我得到一个错误,说明了value(整数)是'不是有效的标识符'...我不允许将数组称为数字吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

BashFAQ的{​​{3}}页面的{p> This section可能在这里有用(尽管你真的应该阅读整页)。

If you need to assign multiline values, keep reading.

A similar trick works for Bash array variables too:

     # Bash/ksh93/mksh/zsh

     typeset readFix=${BASH_VERSION+a}
     aref=realarray
     IFS=' ' read -d '' -r${readFix:-A} "$aref" <<<'words go into array elements'
     echo "${realarray[1]}"   # prints "go"

答案 1 :(得分:1)

不幸的是,Bash不支持多维数组,因此您最好将它们存储为字符串,但可以轻松解析:

储存:

mainTID=${pidArray[$pidCounter]}
readarray -t VALUES < <(exec ps -eL | awk -v tid="$mainTID" '$1 == tid && $2 != tid { print $2 }')
IFS='|' eval 'STORAGE[$mainTID]="${VALUES[*]}"'

使用:

mainTID=${pidArray[$pidCounter]}
IFS='|' read -ra VALUES <<< "${STORAGE[$mainTID]}"
for V in "${VALUES[@]}"; do
    # Do something with $V.
done

注意:STORAGE是一个数组变量。数字已经足够了。但是,如果您要使用除数字之外的键,则在使用之前将其声明为关联数组参数:

declare -A STORAGE

当然,您可以拥有自己的首选参数名称和案例格式。

正如您可能已经注意到的那样,我尝试简化或更正您的Awk命令。我希望我做得对。

另一个注意事项:使用带有前缀+ pid命名变量的间接参数扩展配对是另一个好主意,但对环境来说是一种笨重的污染,并且每次需要扩展时都必须继续使用引用来自变量的值。