0

有人可以告诉我以下两个功能是如何工作的吗?我无法理解评估部分。这些代码片段来自 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\""
}
4

1 回答 1

0

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

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

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

因此${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"

内联,而不是求助于一个相当复杂的函数。

于 2013-08-25T17:56:43.463 回答