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

How to Read a variable in defined in terminal to a bash script


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

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

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

的脚本
#!/bin/bash

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

I 运行 scirpt as ./input.sh 它弹出消息
输入变量名:$a

但是在输出中我有 $a 作为输出而不是 22。我想要 22 作为输出。有办法吗?

你在这里混合了几样东西。从哪里开始...

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

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

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

如果你这样执行:

./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}"

请注意,</code> 表示 "the content of variable 1",<code>${!1} 表示 "the content of the variable that is named </code>"。这是间接部分。</p> <p>现在,如果您想更进一步,让脚本以交互方式读取用户输入(不是参数)并将读取的值用作变量名来扩展,您可以这样做: </p> <pre><code>#!/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 表示 "the content of variable 1",${!1} 表示 "the content of the variable that is named ".

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

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