从 shell 设置变量:如何在脚本中使用它们?

Roc*_*uts 12 shell-script variable

如何设置要在脚本中使用的变量?它们不必是全局/系统范围的,只需当前会话就足够了。但是由于某种原因,即使我直接从当前终端运行脚本,它们似乎也不见了。

例子:

foo=bar
echo "$foo"
Run Code Online (Sandbox Code Playgroud)

输出: bar

但是,如果 test.sh 包含echo "$foo"并且我这样做:

foo=bar
./test.sh
Run Code Online (Sandbox Code Playgroud)

输出为空。如何使用终端会话设置临时变量的范围,该范围在从同一会话执行脚本时仍然有效?

Ken*_*nny 12

export foo=bar将全局变量 $foo 设置为 bar。您还可以使用foo=bar ./test.sh单个命令将 foo 设置为 test.sh 的 bar。

  • `export foo=bar` 需要输入,不带空格…否则你会得到“-bash:export:`=': 不是有效的标识符” (4认同)

小智 7

当您运行 shell 脚本时,它会在一个新的 shell 实例中执行,并且不会继承在交互式 shell 实例中实例化的任何变量。

可以通过这种方式继承特定的变量,称为环境变量。您可以使用 将变量赋值作为环境变量export,例如export foo=bar。这是 bash 语法,其他 shell 可能会使用env或其他一些方法。

您还可以通过“采购”它使 shell 脚本在同一个 shell 实例中执行。您可以使用. test.sh(注意句号)或使用source test.sh. 您可以在交互式会话中执行此操作,也可以在 shell 脚本中执行此操作。这对于创建 shell“库”非常方便,您可以在其中从外部文件中获取一组 shell 函数或变量定义。超级好用。

例如:

#!/bin/bash
. /path/lib.sh
echo $foo # foo is instantiated in lib.sh
do_something # this is a shell function from lib.sh
Run Code Online (Sandbox Code Playgroud)

lib.sh 在哪里:

foo="bar"
do_something() {
echo "I am do_something"
}
Run Code Online (Sandbox Code Playgroud)