gpt4 book ai didi

bash - 将 "$@"存储到一个变量供以后使用,尊重引用的参数

转载 作者:行者123 更新时间:2023-11-29 09:40:35 24 4
gpt4 key购买 nike

我有一个 project written in bash .界面的一部分要求用户调用具有间接层的 bash 函数,如下所示:

require some_fun "arg 1" "arg 2"

它执行 some_fun "arg 1""arg 2"(然后做一些额外的事情,这就是它存在的原因)。目前,我只是调用 "$@" 来执行此操作,并且一切正常。

我现在需要推迟那些函数调用,但无法在 Bash 中找到执行此操作的方法。实际上,每次调用 require 时,我都想将 "$@" 压入堆栈,然后遍历该堆栈并执行参数,就像我当前的行为一样。这将需要 bash 不支持的多维数组,所以我正在尝试:

require() {
dep_num=${#SK_deps[@]}
dep_var="SK_dep_$dep_num"
eval $dep_var="$@"
SK_deps+=($dep_var)
}

它基本上生成一个变量-变量来存储“$@”并将变量名称放入$SK_deps

然后我尝试用以下方法迭代列表:

for dep_var in ${SK_deps[@]}
do
${!dep_name}
done

但这似乎打破了引用的论点,所以:

require some_fun "arg 1" "arg 2"

被解释为:

require some_fun arg 1 arg 2

没有引号。

有什么办法可以做我想做的事吗?使用“$*”也会导致报价定位丢失。感觉应该有一种方法可以在 Bash 中执行此操作,而无需使用 sed/awk。

最佳答案

eval 解决方案还不错。关键是利用 printfshell-quoted 机制,它将为您处理所有棘手的情况:

require() {
local quoted
printf -v quoted ' %q' "$@"
SK_deps+=("$quoted")
}

然后就可以正常运行了:

for dep in "${SK_deps[@]}"; do eval $dep; done

关于bash - 将 "$@"存储到一个变量供以后使用,尊重引用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com