如何从sh文件获取变量值并传递至其他Shell脚本?解决执行后变量值为空的问题
解决Shell脚本间传递环境变量的问题
这问题我太熟悉了!你当前遇到的核心痛点是子shell的环境变量无法传递到父shell——当你用bash ./fetch_credentials.sh执行脚本时,系统会启动一个独立的子shell进程来运行它,脚本里导出的user和pass变量只在这个子shell的生命周期内有效,子shell执行完毕后变量就被销毁了,所以父shell里再调用这些变量自然是空的。
下面给你几种实用的解决方案,按需选择:
方案1:用source(或.)命令执行脚本(最推荐)
如果你希望脚本里的变量直接在当前shell环境中生效,不要启动子shell,就用source命令或者它的简写.(点命令)。这样脚本会直接在当前shell进程中执行,导出的变量会保留在当前环境里。
执行命令如下:
# 两种写法效果完全一致 source ./fetch_credentials.sh # 或者 . ./fetch_credentials.sh # 现在直接调用变量就能拿到值了 echo "userName : "$user echo "password : "$pass
之后你再把这些变量传递给另一个脚本就很简单了,比如:
bash ./your_target_script.sh "$user" "$pass"
方案2:将变量作为参数传递(适合跨子shell场景)
如果必须用子shell执行fetch_credentials.sh,可以修改脚本让它直接输出用户名和密码,然后在调用时捕获输出,再把这些值作为参数传给目标脚本。
首先修改fetch_credentials.sh:
#!/bin/bash # 直接输出用户名和密码,用空格分隔 echo "test test123"
然后用以下方式捕获并传递:
# 方式1:用read拆分输出到变量 read user pass < <(bash ./fetch_credentials.sh) # 传递给目标脚本 bash ./your_target_script.sh "$user" "$pass" # 方式2:用cut拆分输出 credentials=$(bash ./fetch_credentials.sh) user=$(echo "$credentials" | cut -d' ' -f1) pass=$(echo "$credentials" | cut -d' ' -f2) bash ./your_target_script.sh "$user" "$pass"
方案3:通过临时文件传递(适合复杂场景)
如果变量较多或者需要持久化一段时间,可以把变量写入临时文件,让目标脚本读取这个文件。
修改fetch_credentials.sh:
#!/bin/bash # 将变量写入临时文件 echo "user=test" > /tmp/cred_temp.txt echo "pass=test123" >> /tmp/cred_temp.txt
然后在目标脚本your_target_script.sh中读取:
#!/bin/bash # 加载临时文件里的变量 source /tmp/cred_temp.txt # 之后就能直接用$user和$pass了 # 记得用完删除临时文件,避免残留 rm /tmp/cred_temp.txt
内容的提问来源于stack exchange,提问作者Vijesh1985




