shell脚本中可以设置全局变量么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中可以设置全局变量么相关的知识,希望对你有一定的参考价值。

参考技术A 如何通过shell脚本设置全局的环境变量

-bash-3.00# env
HZ=100
LC_MONETARY=en_US.ISO8859-1
SHELL=/usr/bin/bash
TERM=ansi
LC_NUMERIC=en_US.ISO8859-1
MAIL=/var/mail/pc
PATH=/usr/sbin:/usr/bin:.
LC_MESSAGES=C
LC_COLLATE=en_US.ISO8859-1
PWD=/export/home/pc
TZ=PRC
SHLVL=1
HOME=/export/home/pc
LOGNAME=pc
LC_CTYPE=en_US.ISO8859-1
LC_TIME=en_US.ISO8859-1
_=/usr/bin/env

如果只想看指定的变量设置,如路径PATH的设置,可以用 "echo $PATH"或 “ env | grep PATH"或” env | grep -i path"来查询。前面的适合知道全名的,后面2种适合只知道部分字段或者部分关键字母(甚至不确定字符大小写)的。
-bash-3.00# echo $PATH
/usr/sbin:/usr/bin:.
-bash-3.00# env | grep PATH
PATH=/usr/sbin:/usr/bin:.
参考技术B

可以,如下

var="My global variable"
echo $var

参考技术C 因为 管道符 会新建shell来执行后面的while语句,a的值在新建shell中被改写。
你这里 ls 的结果只有一条,所以while循环只执行一次就退出了,从新建shell回到原shell,a的新值不会被带出来,还是"hehe"。

用输入重定向来替换管道符就行了,例如可以这样:

a="hehe"
while read line
do
a="wuwu"
echo "$a"
done <`ls -ltr`
echo "$a"
参考技术D 可以的,设定后在脚本运行中会一直生效

shell脚本中的全局环境变量

【中文标题】shell脚本中的全局环境变量【英文标题】:Global environment variables in a shell script 【发布时间】:2010-11-30 15:48:18 【问题描述】:

如何在 bash 脚本中设置全局环境变量?

如果我做类似的事情

#!/bin/bash
FOO=bar

...或

#!/bin/bash
export FOO=bar

...变量似乎保留在本地上下文中,而我想在脚本完成执行后继续使用它们。

【问题讨论】:

【参考方案1】:

使用. 运行您的脚本

. myscript.sh

这将在当前 shell 环境中运行脚本。

export 控制哪些变量可用于新进程,所以如果你说

FOO=1
export BAR=2
./runScript.sh

那么$BAR将在runScript.sh的环境中可用,但$FOO不会。

【讨论】:

小心第一个。如果没有斜线,它将在您的路径中查找:使用类似 '. ./myscript.sh' 如果你想确保它运行一个特定的。 source. 的别名。因此,如果您想更明确一些,可以运行 source myscript.sh 我想知道当我运行带有点和空格的脚本时会发生什么。例子 。我的脚本 @cNgamba 如果您通过阅读本页的其他答案和/或谷歌搜索找不到新问题,请提出新问题,但这是常见的常见问题解答;另见例如unix.stackexchange.com/questions/114300/…【参考方案2】:

当您运行 shell 脚本时,它是在子 shell 中完成的,因此它不会影响父 shell 的环境。您想通过以下方式获取脚本:

. ./setfoo.sh

这会在 当前 shell 的上下文中执行它,而不是作为 sub shell。

来自 bash 手册页:

。文件名 [参数]源文件名 [参数]

从当前 shell 中的文件名读取并执行命令 环境并返回最后执行的命令的退出状态 来自文件名。

如果文件名不包含斜杠,则使用 PATH 中的文件名 找到包含文件名的目录。

在 PATH 中搜索的文件不必是可执行文件。当 bash 不是 在 POSIX 模式下,如果没有找到文件,则搜索当前目录 在 PATH 中。

如果 shopt 内置命令的 sourcepath 选项被关闭, 未搜索 PATH。

如果提供了任何参数,它们将成为位置参数 当文件名被执行时。

否则位置参数不变。退货状态 是脚本中退出的最后一个命令的状态(如果没有,则为 0 命令被执行),如果文件名未找到或无法找到则返回 false 被阅读。

【讨论】:

有趣——我以前没见过这种语法。这相当于 source ./setfoo.sh 吗? 相同,只是输入速度更快(并且在旧系统上更兼容 - ksh 没有源命令,但它有 '.')。【参考方案3】:

source myscript.sh也是可行的。

linux命令说明source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

【讨论】:

这里可能只是更详细一点。简单描述一下source 的作用怎么样? @PhillipCloud 在终端输入man source,你会得到你想要的。 我熟悉source。也许 OP 不是。 @PhillipCloud 我想了解更多细节。如果您想编辑答案,您绝对可以这样做。帮助事业和所有...谢谢! man source 很可能会返回No manual entry for source。请改用help source。这是因为sourcebash 命令语言解释器中的一个命令,所以它没有自己的手册页。为 shell 内部定义的所有命令键入 help【参考方案4】:
#!/bin/bash
export FOO=bar

#!/bin/bash
FOO=bar
export FOO

人出口:

shell 应将导出属性赋予与指定名称对应的变量,这将使它们处于随后执行的命令的环境中。如果变量名后跟=word,则该变量的值应设置为word。

【讨论】:

请各位 shell 脚本初学者注意:请注意 envvar 名称、'=' 字符和值本身之间没有空格;这行不通:export FOO = /mydir/bar【参考方案5】:
FOO=bar
export FOO

【讨论】:

这个不行,它没有给父进程设置环境变量。 只有父进程才能为父进程设置环境变量。

以上是关于shell脚本中可以设置全局变量么的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中的全局环境变量

环境变量—《linux命令行与shell脚本编程大全》

Linux_Shell脚本编程之设置环境变量

Linux环境变量

Linux环境变量

shell脚本环境变量