shell脚本引用子脚本中的变量

本文探讨了Shell脚本中变量引用的两种方式:`source`和直接执行,以及它们在不同场景下如何影响变量的作用域。通过示例解释了`export`关键字的作用,指出`export`使得变量在子进程中可见,但不影响父进程。总结指出`source`命令使得子脚本代码在当前进程中执行,而`./`或`sh`则启动新的子进程。
摘要由CSDN通过智能技术生成

废话少说! show me the fucking source code!

// 目录结构
.
├── config.sh
└── main.sh

场景1: main脚本引用子脚本中的变量

# config.sh
export NAME1="name1 in config";
NAME2="name2 in config";

# !/bin/bash
# main.sh

# 这样无法引用到config.sh中的变量
./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 这样也无法引用到config.sh中的变量
sh ./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 这样就可以引用到config.sh中的变量
source ./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 通过分析./config.sh还是 sh config.sh作用是一样的,都是新开启了一个shell进行,去执行config.sh
# 而接下来的echo语句是在主shell进程执行的。
# 可以通过 echo $$来打印当前shell执行的pid。

场景2: 子脚本引用主脚本中的变量



# config.sh
echo "NAME3 = ${NAME3}";
echo "NAME4 = ${NAME4}";
# main.sh
export NAME3="name3 in main.sh";
NAME4="name4 in main.sh";

# 这种方式,config.sh只能引用到NAME3,而引用不到NAME4
# 因为NAME3是export出去的。
./config.sh
# 这种方式同样,config.sh只能引用到NAME3,而引用不到NAME4
# 因为NAME3是export出去的。
sh config.sh

# 这种方式对于config.sh来说,NAM3和NAME4都可以引用到
source config.sh

总结: source xxx.sh相当拷贝了一份xxx.sh中的代码到本脚本中,执行过程都是在同一个进程中完成的。而./xxx.sh和 sh xxx.sh都是新fork了一个新的shell进程去执行。而export的作用域是本进程以及本进程的子进程,但是export对于父进程无效。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值