【问题标题】:How to Read a variable in defined in terminal to a bash script如何将终端中定义的变量读取到 bash 脚本
【发布时间】:2017-09-03 18:49:33
【问题描述】:


我是 shell 脚本的新手。关于我们如何读取终端中定义的变量作为 shell 脚本的输入,我有一个非常基本的问题。

假设我在终端中定义了这个变量
a=22
如果我这样做 echo $a 它会在我的终端中输出 22。

我想将此变量作为参数传递给名为 input.sh 的脚本

#!/bin/bash

echo "Enter variable name:"
read Input
echo $Input

我将脚本运行为 ./input.sh 它弹出消息为
输入变量名:$a

但是在输出中我有 $a 作为输出而不是 22。我想要 22 作为输出。有没有办法做到这一点?

【问题讨论】:

    标签: linux bash shell command-line-arguments


    【解决方案1】:

    你在这里混合了几件事。从哪里开始...

    向脚本传递值的常用方法是通过位置参数。

    假设你有这个脚本,叫做s1

    #!/bin/bash    
    echo "First two args are: $1 $2"
    

    如果你这样执行:

    ./s1 Arg1 Arg2
    

    您将看到以下输出:

    First two args are: Arg1 Arg2
    

    如果您想将变量名传递给脚本,并让该脚本输出该变量的值,那么您必须做两件事。首先,初始化变量和export,以便子进程可以看到它(包括您将调用的脚本,除非使用source. 调用,否则它是一个单独的进程)。

    VAR="Some value"
    export VAR
    

    您也可以在一条语句中同时执行这两项操作:

    export VAR="Some value"
    

    然后,调整脚本以执行对变量的间接访问:

    #!/bin/bash    
    echo "Value of variable named $1 : ${!1}"
    

    请注意,$1 表示“变量 1 的内容”,${!1} 表示“名为 $1 的变量的内容”。这是间接部分。

    现在,如果您想更进一步,让脚本以交互方式读取用户输入(不是参数)并使用读取的值作为变量名进行扩展,您可以执行以下操作:

    #!/bin/bash
    echo "Please enter a variable name"
    read VARNAME
    echo "Value of variable named $VARNAME : ${!VARNAME}"
    

    使用位置参数使脚本更容易在非交互式场景中重用,因此读取用户输入应仅限于必要的情况。

    以上是为了帮助理解基础知识。如果您超越了玩具脚本,您将需要了解间接访问的安全含义(尤其是在您允许用户输入的情况下)。您还需要验证位置参数或用户输入对您的目的是否有效(即包含有效的变量名称),以便您的脚本可以做出适当的反应。好吧,您可能需要检查是否一开始就提供了位置参数。所有这些在 shell 脚本中都是可行的,但超出了单个问题的范围。在任何情况下,如果您打算在需要可靠性的情况下拥有健壮的脚本,则需要检查输入(以及错误)。

    【讨论】:

      【解决方案2】:

      在 bash 脚本中使用终端中定义的变量 -

      • 更改脚本的最后一行,使其看起来像 -

        #!/bin/bash
        
        echo "Enter variable name:"
        read Input
        echo ${!Input}
        
      • 在终端上运行你的脚本 input.sh -

        . input.sh
        
      • 最后,当你输入变量名时,不要使用$符号。例如-

        6c4008a16b7c:~ z001lg8$ . input.sh 
        Enter variable name:
        a
        22
        6c4008a16b7c:~ z001lg8$ 
        

      瞧,您现在可以在脚本中使用终端中定义的变量了。

      解释——

      在您的脚本中,将 $Input 更改为 ${!Input} 以便回显用户输入的内容(即变量名)而不是变量名本身。 正如@Fred 所解释的 - $1 表示“变量 1 的内容”,${!1} 表示“名为 $1 的变量的内容”。

      当脚本以. input.sh 运行时,这意味着您正在终端上获取脚本内容。 . 符号用于获取命令/脚本。

      在终端输入变量名时不需要$符号,因为${!Input}格式已经考虑到Input变量中的值是变量名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 2014-12-08
        相关资源
        最近更新 更多