如何设置脚本中使用的变量?它们不必是全局/系统范围的,只需当前会话就足够了。但由于某种原因,即使我直接从当前终端运行脚本,它们似乎也消失了。
例子:
foo=bar
echo "$foo"
输出:bar
但是,如果 test.sh 包含echo "$foo"
并且我这样做:
foo=bar
./test.sh
输出为空。如何使用终端会话设置临时变量的范围,该范围在从同一会话执行脚本时仍然有效?
答案1
export foo=bar
将环境变量设置foo
为 string bar
。您还可以使用foo=bar ./test.sh
单个命令来设置foo
for bar
(test.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
这只是一种方法。