[英]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.