为何无法用带参数的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
相关产品推荐
相关产品推荐

