gpt4 book ai didi

linux - 了解 2 个 shell 函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:12:27 25 4
gpt4 key购买 nike

有人可以告诉我以下两个功能是如何工作的吗?我无法理解评估部分。这些代码片段来自Openwrt上的系统脚本。谢谢

list_contains() {
local var="$1"
local str="$2"
local val

eval "val=\" \${$var} \""
[ "${val%% $str *}" != "$val" ]
}


append() {
local var="$1"
local value="$2"
local sep="${3:- }"

eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
}

最佳答案

这两个函数都使用 shell 变量替换。

sh$ 变量=前缀和后缀 sh$ echo "${变量#前缀}" 和后缀 sh$ echo "${变量%后缀}" 前缀和

%%## 变体替换最长的可能匹配,而上面的函数将替换最短的可能匹配。

因此 ${val%% $str *} 尝试删除包含由空格包围的 $str 的后缀,后跟任何内容。如果没有匹配,则不会删除任何内容,因此 ${val%% $str *} 等于 $val

顺便说一句,我觉得这相当麻烦。我会将此函数简单地编写为

case " $val " in *" $str "*) true;; *) false;; esac

类似地,append 函数尝试以相当迂回的方式将值附加到列表中。该函数使用默认值。

sh$ echo "${variable:-value_if_unset}"
prefixandsuffix
sh$ echo "${another:-value_if_unset}"
value_if_unset
sh$ echo "${variable:+foo}"
foo
sh$ echo "x${another:+foo}"
x

这里复杂的eval的目的是,如果之前没有设置变量,则将其设置为新值,否则将其设置为旧值,后跟分隔符和要附加的新值。

同样,这样写似乎会更简单

variable="${variable}${variable:+ }newvalue"

内联,而不是诉诸相当复杂的函数。

关于linux - 了解 2 个 shell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18426648/

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