Bash在函数之后丢失了变量
我有一个简单的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终止后将失
#!/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()(…)
仍然是首选。