Bash在函数之后丢失了变量

Bash在函数之后丢失了变量,bash,shell,Bash,Shell,我有一个简单的Bash脚本 #!/bin/bash function askExp ( read -ep "$1" -n "$2" -r "$3" ) askExp "PHP? [Y/n]: " 1 php echo $php 如何修改以上脚本才能工作?在echo$php之后没有,我什么也得不到。我需要使用bash函数,因为在此之后,我将在函数中添加一个regexp验证。该函数将在脚本中多次使用。shell运行子shell中(…)下的任何内容,尤其是定义的变量在shell终止后将失

我有一个简单的Bash脚本

#!/bin/bash

function askExp
(
    read -ep "$1" -n "$2" -r "$3"
)
askExp "PHP? [Y/n]: " 1 php

echo $php

如何修改以上脚本才能工作?在echo$php之后没有,我什么也得不到。我需要使用bash函数,因为在此之后,我将在函数中添加一个regexp验证。该函数将在脚本中多次使用。

shell运行子shell中
(…)
下的任何内容,尤其是定义的变量在shell终止后将失去作用域。您需要将函数封装在
{..}
中,该函数将复合语句封装在
bash
shell中,以确保其中的命令与调用的命令在同一shell中运行

function askExp { read -ep "$1" -n "$2" -r "$3"; }
作为一个小实验,你可以观察到

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID
当从同一个外壳运行时

hw(){
  echo hello world from $BASHPID
}
hw 
echo $BASHPID

原因是在前一种情况下,在
(..)
内部创建的shell中设置的变量在本地shell中丢失。

函数定义错误。这是无效的shell语法。这是有效的语法。函数体不限于
{list;}
:它可以是任何复合命令。使用
(列表)
((表达式))
[[expression]]
for
select
case
if
while
,或者
until
,这很奇怪,但却是合法的;在函数名和子shell主体之间需要
()
。我不确定这是否是解析器中的一个bug,但即使它是并且已经修复,
askExp()(…)
仍然是首选。