【问题标题】:Passing one shell script variable to another shell script将一个 shell 脚本变量传递给另一个 shell 脚本
【发布时间】:2011-07-21 01:39:22
【问题描述】:

例如,我正在尝试从另一个脚本访问一个脚本变量,

script1.sh:

export a=10
export b=20
echo "testing"
exit

script2.sh:

. script1.sh
echo $a

这里涉及的问题是它能够从 script2 中的 script1 访问变量 'a' 但它执行 所有命令script1.sh 这很烦人。我只想访问 script1 中导出的变量,不想在 script2 中调用时运行 script1 中的命令。

请帮忙!

谢谢,
卡提克

【问题讨论】:

    标签: linux shell sh external


    【解决方案1】:

    分配一个变量是一个命令。除非你准备好用 bash 写一个 bash 解析器,否则你想做的事是做不到的。

    【讨论】:

      【解决方案2】:

      如果你的变量赋值是永远在上面指出的精确形式,那就是

      export a=10
      

      然后您可以使用grepeval 结果提取这些分配。您的 script2.sh 将是

      eval `grep "^export " script1.sh`
      echo $a
      

      但是这样做非常脆弱,并且可能会以多种方式破坏。正如其他人所建议的那样,将变量赋值放在两者都提供的第三个脚本中要安全得多。

      如果您在条件句中有变量设置,或者如果您导出的变量依赖于遗漏的其他非导出变量,或者如果您单独设置和导出变量,这可能会中断;如果您碰巧在导出中使用了命令替换,那么它们仍然会运行并可能产生副作用。

      if [ $doexport = 1 ]; then
        export a=1
      fi
      
      a=2
      export a
      
      b=2
      export a=$b
      
      export a=`ls |wc -l`
      

      这些都是潜在的问题。

      【讨论】:

      • 您和 jlliagre 建议的两个答案都确实有效,但您能详细解释使用这种方法的局限性吗?
      【解决方案3】:

      您正在尝试做的事情(仅从另一个脚本中获取变量,而不执行命令)是不可能的。

      这里有一个解决方法:

      将变量声明和初始化提取到第三个文件,然后由两者提供。

      普通变量:

      export a=10
      export b=20
      

      script1.sh:

      . common-vars
      echo "testing"
      exit
      

      script2.sh:

      . common-vars
      echo $a
      

      【讨论】:

        【解决方案4】:

        我同意伊格纳西奥·巴斯克斯-艾布拉姆斯的观点。

        分配一个变量是一个命令

        您对此无能为力。

        一个可能的解决方案是将变量定义分离到第三个脚本中,该脚本将用作配置脚本。所以 script1script2 都会source 那个,使用那里定义的变量。

        【讨论】:

          【解决方案5】:

          script2.sh:

          eval "$(grep export script1.sh)"
          echo $a
          

          【讨论】:

            【解决方案6】:

            您可以通过将变量作为参数传递来将变量从一个脚本传递到另一个脚本。 这当然意味着脚本B会被脚本A调用。脚本B需要检查传递的参数是否为空。

            【讨论】:

              【解决方案7】:

              我同意“Ignacio Vazquez-Abrams”的观点,这是对您问题的一个很好的回答。

              但我有另一个解决方案给你,你没有导出你的变量。概念基于:使用您的登录 shell 来运行这两个脚本而不是新的 shell。

              假设您的 script1.sh 是:

              a=10 
              
              b=20
              

              现在在您的登录 shell 中运行您的脚本:

              例子:

              .[space]script1
              

              现在,如果您要访问脚本中的变量 a,您将可以毫无问题地访问它。

              示例

              假设您的 script2.sh 是:

              echo $a
              

              运行:

              .[space]script2
              

              【讨论】: