用结果填充数组时,bash,奇怪的变量范围
Posted
技术标签:
【中文标题】用结果填充数组时,bash,奇怪的变量范围【英文标题】:Bash, weird variable scope when populating array with results 【发布时间】:2011-11-28 13:34:00 【问题描述】:我正在解析命令输出并将结果放入数组中。
在退出内部循环之前工作正常 - 输出数组为空。
declare -a KEYS
#-----------------------------------------------------------------------------#
get_keys()
# this extracts key NAMES from log in format "timestamp keycode"
$glue_dir/get_keys $ip | while read line; do
echo line: $line
set -- $line # $1 timestamp $2 keycode
echo 1: $1 2: $2
key=(`egrep "\\s$2$" "$glue_dir/keycodes"`) # tested for matching '40' against 401, 402 etc
set -- $key # $1 key name $2 keycode
KEYS+=("$1")
echo key $1
echo KEYS inside loop: "$KEYS[@]"
done
echo KEYS outside loop: "$KEYS[@]"
再次运行两条输出线时的输出:
line: 1270899320451 38
1: 1270899320451 2: 38
key UP
KEYS inside loop: UP
line: 1270899320956 40
1: 1270899320956 2: 40
key DOWN
KEYS inside loop: UP DOWN
KEYS outside loop:
我花了一个小时试图弄清楚这一点。请帮忙。 ;-)
【问题讨论】:
谢谢,你的问题救了我!以及答案! 【参考方案1】:当您使用管道 (|
) 将命令输出传递给 while
时,您的 while
循环将在子 shell 中运行。当循环结束时,您的子shell 终止并且您的变量在循环之外将不可用。
改用process substitution:
while read line; do
# ...
done < <($glue_dir/get_keys $ip)
【讨论】:
我非常接近这个解决方案,但由于以上是关于用结果填充数组时,bash,奇怪的变量范围的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter:从视图中调用视图时的变量范围。奇怪的
MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用