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

Obi*_*ill 6 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"
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Ada*_*man 9

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

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

source your_script.sh
Run Code Online (Sandbox Code Playgroud)

要么

. your_script.sh
Run Code Online (Sandbox Code Playgroud)

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

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

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


Mic*_*ker 2

您不能在子进程中为父进程设置环境变量。您可以做的是source script.sh或者. script.sh代替执行它,在这种情况下,它在同一个 bash 进程中执行,并且所有更改都被保留。

另外,如果您想在初始化脚本和其他地方设置相同的变量,您可以将其放入/etc/default/something,这更常见。最后你可以source将此文件写入bashrc/etc/profile.d/something文件中。