有人可以告诉我以下2个功能的工作原理吗?我无法绕过eval部分。 这些代码片段来自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\""
}
答案 0 :(得分:0)
这两个函数都使用shell变量替换。
sh $ variable = prefixandsuffix sh $ echo“$ {variable#prefix}” andsuffix sh $ echo“$ {variable%suffix}” prefixand
%%
和##
变体替换最长的匹配,而上述函数将替换最短的匹配。
因此${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"
内联,而不是诉诸相当复杂的功能。