理解2个shell函数

时间:2013-08-25 07:16:39

标签: linux function shell

有人可以告诉我以下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\""
}

1 个答案:

答案 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"

内联,而不是诉诸相当复杂的功能。