Bash 在shell脚本中分配变量以在脚本外部使用

Bash 在shell脚本中分配变量以在脚本外部使用,bash,Bash,我有一个设置变量的shell脚本。我可以在脚本内部访问它,但不能在脚本外部访问它。是否可以使变量成为全局变量 正如预期的那样,在创建变量之前访问该变量不会返回任何结果: $ echo $mac $ $ ./mac.sh 12:34:56:ab:cd:ef $ $ echo $mac $ 创建脚本以创建变量: #!/bin/bash mac=$(cat \/sys\/class\/net\/eth0\/address) echo $mac exit 0 $ cat mac.sh #!

我有一个设置变量的shell脚本。我可以在脚本内部访问它,但不能在脚本外部访问它。是否可以使变量成为全局变量

正如预期的那样,在创建变量之前访问该变量不会返回任何结果:

$ echo $mac

$
$ ./mac.sh
12:34:56:ab:cd:ef
$ 
$ echo $mac

$
创建脚本以创建变量:

#!/bin/bash
mac=$(cat \/sys\/class\/net\/eth0\/address)
echo $mac
exit 0
$ cat mac.sh
#!/bin/bash
echo mac=$(cat /sys/class/net/eth0/address)
$ bash mac.sh
mac=12:34:56:ab:cd:ef
$ eval $(bash mac.sh)
$ echo $mac
12:34:56:ab:cd:ef
$
运行脚本将按预期提供当前mac地址:

$ echo $mac

$
$ ./mac.sh
12:34:56:ab:cd:ef
$ 
$ echo $mac

$
在创建变量后访问该变量不会返回任何结果,这不是预期的:

$ echo $mac

$
$ ./mac.sh
12:34:56:ab:cd:ef
$ 
$ echo $mac

$

有没有办法在命令行和其他脚本中访问此变量?

子进程不能像这样影响父进程

您必须使用
(dot)命令,或者,如果您喜欢C shell符号,则使用
源代码
命令来读取脚本(因此
.script
源代码脚本
):

或者在标准输出上生成赋值,并使用
eval$(脚本)
设置变量:

#!/bin/bash
mac=$(cat \/sys\/class\/net\/eth0\/address)
echo $mac
exit 0
$ cat mac.sh
#!/bin/bash
echo mac=$(cat /sys/class/net/eth0/address)
$ bash mac.sh
mac=12:34:56:ab:cd:ef
$ eval $(bash mac.sh)
$ echo $mac
12:34:56:ab:cd:ef
$
请注意,如果在指定点或源命令的脚本时不使用斜杠,则shell将在
$PATH
中列出的目录中搜索脚本。脚本不必是可执行的;可读性就足够了(只读是有益的,因为您不会意外地运行脚本)

不清楚路径名中的所有反斜杠除了混淆之外应该做什么;它们是不必要的


有关生成这样的脚本的先例,请参阅。

子进程不能影响这样的父进程

您必须使用
(dot)命令,或者,如果您喜欢C shell符号,则使用
源代码
命令来读取脚本(因此
.script
源代码脚本
):

或者在标准输出上生成赋值,并使用
eval$(脚本)
设置变量:

#!/bin/bash
mac=$(cat \/sys\/class\/net\/eth0\/address)
echo $mac
exit 0
$ cat mac.sh
#!/bin/bash
echo mac=$(cat /sys/class/net/eth0/address)
$ bash mac.sh
mac=12:34:56:ab:cd:ef
$ eval $(bash mac.sh)
$ echo $mac
12:34:56:ab:cd:ef
$
请注意,如果在指定点或源命令的脚本时不使用斜杠,则shell将在
$PATH
中列出的目录中搜索脚本。脚本不必是可执行的;可读性就足够了(只读是有益的,因为您不会意外地运行脚本)

不清楚路径名中的所有反斜杠除了混淆之外应该做什么;它们是不必要的


有关生成这样的脚本的先例,请参阅。

谢谢。我去掉了反斜杠。我尝试了上面的脚本,我可以按照第一部分进行操作,但是当我运行
$(bash mac.sh)
时,我得到了
-bash:mac=12:34:56:ab:cd:ef:command-not-found
,然后我仍然得到
echo$mac
的空白响应。我更新了我的答案@GFL,修复了我的错误(添加了
eval
-但是要小心;
eval
可能会很危险)。我也注意到了
ssh-agent
作为我建议的先例。谢谢。我删除了反斜杠。我尝试了上面的脚本,我可以按照第一部分操作,但是当我运行
$(bash-mac.sh)时
我得到了
-bash:mac=12:34:56:ab:cd:ef:command-not-found
,之后我仍然得到了
echo$mac
的空白响应。我已经更新了我的答案,@GFL,修正了我的错误(添加了
eval
,但要小心;
eval
可能会很危险).我还注意到
ssh-agent
是我建议的先例。“全局”一词的有趣用法。如果你想让主机上的所有进程都可以使用数据,自然的解决方案是将数据写入文件系统。如果你想让主机上的所有进程共享相同的内存空间,你就会寻求混乱。也许你想让它成为一个环境变量?如果你想了解详细信息,我可以写一个答案。“全局”这个词的有趣用法。如果您想让主机上的所有进程都可以使用数据,自然的解决方案是将该数据写入文件系统。如果您想让主机上的所有进程共享相同的内存空间,您会寻求混乱。也许您想让它成为一个环境变量?如果您想了解详细信息,我可以写一个答案。