You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从sh文件获取变量值并传递至其他Shell脚本?解决执行后变量值为空的问题

解决Shell脚本间传递环境变量的问题

这问题我太熟悉了!你当前遇到的核心痛点是子shell的环境变量无法传递到父shell——当你用bash ./fetch_credentials.sh执行脚本时,系统会启动一个独立的子shell进程来运行它,脚本里导出的userpass变量只在这个子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

火山引擎 最新活动