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

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

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

例子:

foo=bar
echo "$foo"

输出:bar

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

foo=bar
./test.sh

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

答案1

export foo=bar将环境变量设置foo为 string bar。您还可以使用foo=bar ./test.sh单个命令来设置foofor bartest.sh即避免在本地 shell 会话中设置变量)。

答案2

当您运行 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

其中 lib.sh 是:

foo="bar"
do_something() {
echo "I am do_something"
}

答案3

另一种选择是将变量作为参数传递给脚本。

foo=bar
./test.sh $foo

那么问题就变成了./test.sh的内容

它必须echo $1代替echo $foo- $1 表示传递给脚本的第一个参数。

答案4

您可以在同一 shell 中运行分配和回显测试脚本。

root@ijaz-HP-EliteBook-8560p:~# export foo=bar
root@ijaz-HP-EliteBook-8560p:~# cat test.sh 
   #!/bin/bash
   echo "$foo"
root@ijaz-HP-EliteBook-8560p:~# ./test.sh 
bar

这只是一种方法。

相关内容