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
我有一个填充全局 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