繁体   English   中英

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

[英]How to Read a variable in defined in terminal to a bash script


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

假设我在终端中定义了此变量
一个= 22
如果我确实echo $a ,则在我的终端中给出22作为输出。

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

#!/bin/bash

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

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

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

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

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

假设您有一个名为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的变量的内容”。 这是间接的部分。

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

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

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

以上内容是为了帮助您了解基础知识。 如果您不喜欢玩具脚本,则需要了解间接访问的安全隐患(尤其是在允许用户输入的情况下)。 您还需要验证位置参数或用户输入是否对您的目的有效(即,包含有效的变量名),以便您可以使脚本做出适当的反应。 好吧,您可能需要检查是否甚至提供了位置参数。 所有这些在shell脚本中都是可行的,但超出了单个问题的范围。 无论如何,如果您打算在期望可靠性的情况下使用可靠的脚本,则需要检查输入(以及错误)。

要在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.sh ,这意味着您正在终端上采购脚本内容。 . 符号用于获取命令/脚本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM