bash 函数在通过 $() 调用时无法更改局部变量的值

bash 函数在通过 $() 调用时无法更改局部变量的值

以下代码的工作方式取决于 Parse_Short_Switches() 的调用方式。使用 result=$(Parse_Short_Switches) 调用函数“Parse_Short_Switches”后,$error_flag 的值并未像我预期的那样设置为 -1。

仅使用 Parse_Short_Switches 调用函数“Parse_Short_Switches”之后,$error_flag 的值就会像我预期的那样设置为 -1。

任何帮助都将不胜感激。谢谢

#!/bin/bash

function Parse_Short_Switches()
{
echo "error_flag inside of the function= $error_flag" 1>&2
error_flag="-1"
echo "blah blah ..."
}

# --- MAIN ---
error_flag="999"
echo "error_flag= $error_flag"
#result=$(Parse_Short_Switches)
Parse_Short_Switches
echo "error_flag= $error_flag"

答案1

这是因为命令替换$()会生成一个子 shell,并且里面的命令在该子 shell 中运行。

因此对任何数据结构所做的任何修改都不会传播到父 shell。换句话说,更改确实在子 shell 中进行,因此父 shell 的相关参数不会受到影响。

附注:当您执行脚本时,它会在子 shell 中运行;使所有参数更改在调用 shell 中可用的常见技巧是source( .) 脚本。

例子:

$ foo() { bar=2 ;}

$ bar=1

$ $(foo)

$ echo "$bar"
1

$ foo

$ echo "$bar"
2

相关内容