Bash 如果按 if 条件执行函数,则数组无法填充

Bash array fails to populate if function is executed as if condition

我有一个填充全局 bash 数组的函数

#!/bin/bash

# Array to store debugger IDs
ID=()

fill_id()
{
    for i in 1 2 3 4 5
    do
        ID+=( $i )
    done

    echo "fill_ids      - entries in ID: ${#ID[*]}"
}

如果直接调用函数,则会填充数组并将条目数打印为 5

fill_id
echo "main          - entries in ID: ${#ID[*]}"

输出

fill_ids      - entries in ID: 5
main          - entries in ID: 5

但如果在 if 条件下调用函数,则条目计数打印为 0

if (fill_id)
then
    echo "main          - entries in ID: ${#ID[*]}"
fi

输出

fill_ids      - entries in ID: 5
main          - entries in ID: 0

Return fill_fd 的值也不影响任何东西。

你正在子shell中执行函数所以它改变了子shell的变量,这在父shell中是不可见的 罪魁祸首是“()” 你可以通过打印 shell id 来调试它——见下文:

#!/bin/bash

# Array to store debugger IDs
ID=()

echo $BASHPID
fill_id()
{
    for i in 1 2 3 4 5
    do
        ID+=( $i )
    done
echo $BASHPID
    echo "fill_ids      - entries in ID: ${#ID[*]}"
}


if  (fill_id)
then
    echo "main          - entries in ID: ${#ID[*]}"
fi

当你直接调用函数时(没有 subshell)然后它会正确地改变你的变量。

像这样:

if fill_id
then
    echo "main          - entries in ID: ${#ID[*]}"
fi

只是不要在子 shell 中执行函数。

if fill_id
then
    echo "main          - entries in ID: ${#ID[*]}"
fi