2017-04-08 61 views
0


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

让我们说我在终端定义这个变量
A = 22
如果我这样做echo $a它给出22在我端子输出。

我想这个变量作为参数传递给一个名为input.sh

#!/bin/bash 

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

脚本我跑了scirpt作为./input.sh它弹出的消息
输入变量名:$ a

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

回答

2

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

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

假设你这个剧本,叫s1

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

如果你喜欢这个执行:

./s1 Arg1 Arg2 

您将看到以下的输出:

First two args are: Arg1 Arg2 

如果您想要将一个变量名称传递给脚本,并让该脚本输出这个值变量,那么你必须做两件事。首先,初始化变量并使其可以通过子进程(包括您将调用的脚本,这是一个单独的进程,除非使用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脚本中都是可行的,但超出了单个问题的范围。在任何情况下,如果您打算在预期可靠性的情况下拥有健壮的脚本,则需要检查输入(以及错误)。

0

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

  • 更改脚本的最后一行,这样它看起来像 -

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

    . input.sh 
    
  • 最后,当您输入第e变量名称,不要使用$符号。对于例如 -

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

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

解释 -

在脚本中,这样用户输入(变量名)的内容是呼应$输入更改为$ {输入!},而不是变量名本身。 正如@Fred所解释的那样 - $ 1表示“变量1的内容”,$ {!1}表示“名称为$ 1的变量的内容”。

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

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