我是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。有没有办法做到这一点?
答案 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
变量中的值是变量名称。