你在这里混合了几件事情。从哪里开始...
将值传递给脚本的常用方法是通过位置参数。
假设你这个剧本,叫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脚本中都是可行的,但超出了单个问题的范围。在任何情况下,如果您打算在预期可靠性的情况下拥有健壮的脚本,则需要检查输入(以及错误)。