如何在POSIX Shell中调用函数后保留参数供后续函数使用
Shell脚本函数参数无法保留的解决方法
问题核心:你在addEnvFile函数里用set --修改的是函数自身的位置参数,不会影响脚本全局的位置参数,所以函数执行完后,脚本的$*还是初始值,导致sampleFn拿不到新增的参数。
下面是几种可行的解决方案:
方案1:用全局变量存储参数
定义一个全局变量来保存需要添加的参数,让所有函数可以直接访问:
#!/usr/bin/env sh TARGET_FILE="${ENV}.env" EXTRA_ARGS="" addEnvFile() { if [ -f "$TARGET_FILE" ]; then EXTRA_ARGS="-env=${TARGET_FILE}" echo "ARGUMENTS: $EXTRA_ARGS" fi } sampleFn() { echo "CURRENT ARGUMENTS: $*" } addEnvFile sampleFn "$EXTRA_ARGS"
方案2:直接修改脚本全局位置参数
如果需要保留脚本原本的位置参数,同时新增参数,可以在函数里直接更新全局的位置参数:
#!/usr/bin/env sh TARGET_FILE="${ENV}.env" addEnvFile() { if [ -f "$TARGET_FILE" ]; then # 保留原有参数,追加新参数 set -- "$@" "-env=${TARGET_FILE}" echo "ARGUMENTS: $*" fi } sampleFn() { echo "CURRENT ARGUMENTS: $*" } addEnvFile sampleFn "$*"
这里函数内的$@引用的是脚本全局的位置参数,修改后会直接覆盖全局的位置参数集合。
方案3:函数返回参数,外部更新
如果希望函数只负责生成参数,不直接修改全局状态,可以让函数输出参数,外部捕获后更新全局位置参数:
#!/usr/bin/env sh TARGET_FILE="${ENV}.env" addEnvFile() { if [ -f "$TARGET_FILE" ]; then echo "-env=${TARGET_FILE}" fi } sampleFn() { echo "CURRENT ARGUMENTS: $*" } NEW_ARG=$(addEnvFile) # 保留原有参数,添加新参数 set -- "$@" "$NEW_ARG" sampleFn "$*"
适用场景说明
- 方案1:适合参数简单,不需要和脚本原有参数混合的场景;
- 方案2:适合需要合并原有参数,统一用位置参数管理的场景;
- 方案3:适合追求函数单一职责,不想让函数修改全局状态的场景。
内容的提问来源于stack exchange,提问作者Hector Manuel
相关产品推荐
相关产品推荐

