如何将终端定义的变量读入Bash脚本

5


我刚接触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作为输出。 有什么办法可以做到这一点吗?

2个回答

6
你在这里混淆了几件事情。从哪里开始呢...
向脚本传递值的通常方法是通过位置参数。
假设你有一个名为 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脚本中完成,但超出了一个单一问题的范围。无论如何,在希望可靠性的情况下拥有强大的脚本,都需要检查输入(以及错误)。

1

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

  • Change last line of your script so that it looks like -

    #!/bin/bash
    
    echo "Enter variable name:"
    read Input
    echo ${!Input}
    
  • Run your script input.sh on the terminal as -

    . input.sh
    
  • And finally, when you input the variable name, do not use $ sign. For e.g. -

    6c4008a16b7c:~ z001lg8$ . input.sh 
    Enter variable name:
    a
    22
    6c4008a16b7c:~ z001lg8$ 
    
Voila,现在您可以在脚本中使用终端定义的变量。
解释 -
在您的脚本中,$Input被更改为${!Input},以便回显用户输入的内容(即变量名)而不是变量名本身。 正如@Fred所解释的那样 - $1表示“变量1的内容”,${!1}表示“以$1命名的变量的内容”。
当脚本以 . input.sh 运行时,这意味着您正在源终端上的脚本内容。 “。”符号用于源命令/脚本。
当变量名在终端中输入时,不需要$符号,因为${!Input}格式已经考虑到了Input变量中的值是一个变量名。

参考文档总是能够提高答案的质量。 - EnthusiastiC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接