我正在使用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脚本中定义一个变量,以便我可以在它外面访问它?!
提前致谢。
答案 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
文件。