如何定义shell脚本变量以使脚本位于脚本之外

时间:2011-11-16 15:14:17

标签: bash shell ubuntu

我正在使用Ubuntu Natty。

我有一个shell脚本,我已保存到/etc/init.d/qstart。 shell脚本包含以下内容:

apt-get -y update
apt-get -y upgrade
apt-get -y install tofrodos gcc make nmap lsof expect sysstat
dbpass="mydbpassword"

但是,在我执行脚本之后,我想测试dbpass是否已设置,并在提示符中输入echo $dbpass。但它是空的。

如何在我的shell脚本中定义一个变量,以便我可以在它外面访问它?!

提前致谢。

2 个答案:

答案 0 :(得分:9)

您无法在父进程的环境中设置变量。您只能设置当前流程的环境或为流程的子项准备环境。

也就是说,您可以指示shell在当前shell进程中从脚本运行命令,而不是分支新shell。你可以这样做:

source your_script.sh

. your_script.sh

(注意点后面的空格)。由于此处your_script.sh内的命令由当前shell运行,因此将保留对脚本内部环境所做的更改。

但是,如果运行脚本的shell不是您希望使用环境变量的shell的祖先,那么根本无法使用环境变量实现目标。例如,如果脚本在初始化时由某些无子shell运行,则所有环境设置都会完全丢失。在这种情况下,使用一些其他机制,如文件(可能在/var下)。

如果您希望给定shell的所有实例都在其环境中设置某些变量,则可以使用大多数shell使用的初始化脚本。通常,它们具有系统范围和每用户初始化脚本。例如,bash使用/etc/profile作为交互式登录shell的系统范围初始化脚本,并使用$HOME/.bash_profile(也$HOME/.bash_login$HOME/.profile)作为按用户初始化脚本。有关特定于bash的详细信息,请参阅this reference。如果您使用其他外壳,请尝试相应的手册。

答案 1 :(得分:2)

您无法在子进程中为父进程设置环境变量。您可以做的是source script.sh. script.sh而不是执行它,在这种情况下,它在同一个bash过程中执行,并保留所有更改。

此外,如果您希望在init脚本和其他位置设置相同的变量,可以将其放入/etc/default/something,这更常见。最后,您可以source将此文件转换为bashrc/etc/profile.d/something文件。