【问题标题】:Bash lost variables after functionBash在函数后丢失了变量
【发布时间】:2017-11-08 20:23:34
【问题描述】:

我有一个简单的 Bash 脚本。

#!/bin/bash

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

echo $php

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

【问题讨论】:

  • 函数定义错误。这是无效的 shell 语法。
  • 这是有效的语法。函数体不限于{ list; }:它可以是任何复合命令。使用(list)((expression))[[ expression ]]forselectcaseifwhileuntil 很奇怪但合法。
  • 其实有点不对;您需要在函数名称和子shell 主体之间使用()。我不确定这是否是解析器中的错误,但即使它是并且已修复,askExp () ( ... ) 仍然是首选。

标签: bash shell


【解决方案1】:

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

function askExp { read -ep "$1" -n "$2" -r "$3"; }

作为一个小实验,你可以观察

的输出
hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

当从同一个 shell 运行时。

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

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

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多