2014-07-09 34 views
0

我有一个问题,试图设置和填充名称的数组应该是另一个变量的值......任何人都可以帮忙吗?Bash设置数组名称为变量值

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

     $mainTID=($tempThreadIDs) 

mainTID是一个整数,我想打电话给数组无论是整数,然后用所谓的列表填充它tempThreadIDs“

我想过使用eval,但我真的需要保留我的开销下降,我无法真正让它工作正常...然后我试图只声明数组,但我得到一个错误,指出值(一个整数)是'不是一个有效的标识符'...我不允许给数组调用一个数字吗?

在此先感谢!

+1

你究竟想要做什么?代码似乎几乎完全与你的问题无关。 –

+0

什么是ps -eL | grep $ {mainTID}'应该这样做? – anubhava

+2

您似乎在寻找间接参数扩展(请参阅手册页),但仅包含数字的参数名称仅用于位置参数。 – chepner

回答

1

This sectionHow can I use variable variables (indirect variables, pointers, references) or associative arrays?页面的BashFAQ很可能在这里有一些用处(虽然你真的应该阅读整个页面)。

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

不幸的是击不支持多维数组,所以你可能只是最好将它们存储为字符串,但可以很容易地分析:

储存:

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命名变量配对是另一个好主意,但会对环境造成巨大的污染,并且会让您感到困惑,因为您每次需要时都要继续使用参考从变量中扩展一个值。