You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用带参数的source命令修改当前环境的$1变量,以及如何内部修改位置参数$1

为何无法用带参数的source命令修改当前环境的$1变量,以及如何内部修改位置参数$1

嘿,我来帮你捋清楚这个问题~

首先说说为什么你用source ./script.sh Hello World后,当前shell里的$1和$2还是空的:
当你用source(或者.)执行脚本时,虽然脚本是在当前shell进程里运行,但你传递的参数是属于这个脚本的局部执行上下文的。也就是说,脚本里的$1、$2是这次source调用时给脚本的专属参数,并不会覆盖当前shell本身的位置参数(也就是你直接在命令行环境里的$1)。脚本执行完后,它的局部上下文就结束了,当前shell的位置参数自然不会被改变。

你给出的例子也能验证这一点:

# script.sh内容
echo $1
echo $2

# 执行命令
$ source ./script.sh Hello World
Hello
World
$ echo $1 $2
(nothing output)

这里脚本里的echo $1输出的是脚本拿到的参数Hello,但当前shell的$1从来没被修改过,所以最后echo $1 $2没东西输出。

那要怎么修改当前shell的位置参数$1呢?
用set --命令就可以!这个命令能直接重置当前shell的位置参数列表。比如:

# 把当前shell的$1设为"NewHello",$2设为"NewWorld"
set -- NewHello NewWorld
# 现在查看结果
echo $1 $2
# 会输出:NewHello NewWorld

如果你的需求是在source脚本的时候,让脚本内部修改当前shell的位置参数,那可以在script.sh里加上set --命令。比如修改你的脚本:

# script.sh
echo "脚本收到的参数:$1 $2"
# 重置当前shell的位置参数
set -- "UpdatedHello" "UpdatedWorld"

然后执行source ./script.sh Hello World,之后再在命令行里echo $1 $2,就会输出UpdatedHello UpdatedWorld啦!

备注:内容来源于stack exchange,提问作者chen zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:54:27