如何在Bash函数中修改全局变量并返回布尔值?
Bash脚本:同时修改全局数组并获取函数返回值的解决方案
问题场景
使用环境:
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
编写的脚本:
#!/bin/bash map2=() result="" f() { tmpA=(12 34 7844); map2=("${tmpA[@]}"); echo true; return; } result=$(f) echo result=$result : array=${map2[@]}
执行后输出:
result=true : array=
若将result=$(f)替换为直接调用f,输出变为:
result= : array=12 34 7844
核心需求:实现既能修改全局数组,又能获取函数返回值的方法。
解决方案
问题本质是$(f)会在子shell中执行函数,子shell内对全局变量的修改无法同步到父shell,导致数组map2在父shell中为空。以下是三种可行的解决方式:
方式一:用返回状态码传递简单状态,结合全局数组
bash函数的返回状态码(0-255整数)可用来传递成功/失败这类简单逻辑,函数直接修改全局数组:
#!/bin/bash map2=() f() { tmpA=(12 34 7844) map2=("${tmpA[@]}") # 返回0代表成功(对应逻辑上的true),非0代表失败 return 0 } if f; then result="true" else result="false" fi echo result=$result : array=${map2[@]}
执行结果:
result=true : array=12 34 7844
方式二:用自定义文件描述符传递返回值
如果需要传递字符串类型的返回值,可通过自定义文件描述符输出内容,避免子shell的影响:
#!/bin/bash map2=() f() { tmpA=(12 34 7844) map2=("${tmpA[@]}") # 通过3号文件描述符输出返回值 echo "true" >&3 } # 捕获3号描述符的输出到result变量 result=$(f 3>&1 1>&2) echo result=$result : array=${map2[@]}
执行结果:
result=true : array=12 34 7844
方式三:用全局变量同时传递返回值和数组
直接在函数内修改两个全局变量,分别存储返回值和数组:
#!/bin/bash map2=() func_result="" f() { tmpA=(12 34 7844) map2=("${tmpA[@]}") func_result="true" } f echo result=$func_result : array=${map2[@]}
执行结果:
result=true : array=12 34 7844
内容的提问来源于stack exchange,提问作者Dte
相关产品推荐
相关产品推荐

