如何将终端中定义的变量读取到bash脚本中

时间:2017-04-08 12:34:13

标签: linux bash shell command-line-arguments


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

让我们说我在我的终端中定义了这个变量 一个= 22
如果我做echo $a它在我的终端中输出22作为输出。

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

的脚本
#!/bin/bash

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

假设您有此脚本,名为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脚本中都是可行的,但超出了单个问题的范围。在任何情况下,如果您打算在需要可靠性的情况下使用健壮的脚本,则需要检查输入(以及错误)。

答案 1 :(得分:0)

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

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

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

    . input.sh
    
  • 最后,当您输入变量名称时,请勿使用$ sign。对于例如 -

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

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

说明 -

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

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

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