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

BAS*_*ASH 4 bash scripts functions

根据调用 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"
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 5

那是因为命令替换,$()生成了一个子 shell,并且其中的命令在该子 shell 中运行。

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

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

例子:

$ foo() { bar=2 ;}

$ bar=1

$ $(foo)

$ echo "$bar"
1

$ foo

$ echo "$bar"
2
Run Code Online (Sandbox Code Playgroud)