如何将终端中定义的变量读取到 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
变量中的值是一个变量名。
我是 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
变量中的值是一个变量名。