【问题标题】:How to preserve arguments after calling a function in POSIX如何在 POSIX 中调用函数后保留参数
【发布时间】:2022-12-11 17:13:44
【问题描述】:

为了重用一些代码和分割我的脚本,我有一个函数来检查一些条件并为脚本执行添加参数。但是,函数完成后,设置的参数不会保留。

这是我的意图的一个简单示例:

#!/usr/bin/env sh

TARGET_FILE="${ENV}.env"

addEnvFile() {
    if [ -f "$TARGET_FILE" ]; then
        set -- "-env=${TARGET_FILE}"
        echo "ARGUMENTS: $*"
    fi
}

sampleFn() {
    # I need the arguments set in the "addEnvFile" function
    echo "CURRENT ARGUMENTS: $*"
}

addEnvFile
sampleFn "$*"

我的目标是让“addEnvFile”函数 (-env=dev.env) 的参数可用于在 sampleFn 中执行命令

【问题讨论】:

  • set -- 函数内部将修改它自己的参数,而不是调用者的参数。
  • 是的,这也是我的理解,这就是为什么我要问“如何”去做,也许还有其他解决方法
  • 好吧,解决方法是在主脚本中使用[ -f "$TARGET_FILE" ] && set -- "-env=${TARGET_FILE}",然后调用sampleFn "$@"

标签: linux bash posix


【解决方案1】:

你可以让 addEnvFile() 只回显参数并用 set -- $(addEnvFile) 调用它:

#!/usr/bin/env sh

TARGET_FILE="${ENV}.env"

addEnvFile() {
    if [ -f "$TARGET_FILE" ]; then
        echo "-env=${TARGET_FILE}"
    fi
}

sampleFn() {
    # I need the arguments set in the "addEnvFile" function
    echo "CURRENT ARGUMENTS: $@"
}

set -- $(addEnvFile)
sampleFn "$@"
$ file dev.env 
dev.env: empty
$ ENV=dev ./args.sh 
CURRENT ARGUMENTS: -env=dev.env

请注意,我还将 "$*" 更改为 "$@",以便在您有多个参数时它可以正常工作。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2023-01-12
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多