用结果填充数组时,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,奇怪的变量范围的主要内容,如果未能解决你的问题,请参考以下文章

Swift:填充二维数组时出现索引超出范围错误

Codeigniter:从视图中调用视图时的变量范围。奇怪的

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

尝试读取解析的 JSON 数组时索引超出范围

以编程方式(VBA,C#)将数组字符串设置为范围时,奇怪的单元格中字符数限制

为啥当我在函数中声明一个名称为全局数组的局部数组时,bash 会引发未绑定变量警告?