曲径通幽论坛

标题: [functions]append [打印本页]

作者: beyes    时间: 2014-12-4 21:49
标题: [functions]append
/lib/functions.sh 中 append() 函数用来将某个 “名字” 附加到一个字符串上,其定义如下:
[Bash shell] 纯文本查看 复制代码
append() {                                                                                               
        local var="$1"                                                                                   
        local value="$2"                                                                                 
        local sep="${3:- }"                                                                              
                                                                                                         
        eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""            
}



使用方法:
  1. append "$name1" "$name2"
复制代码


测试代码:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh

. /lib/functions.sh

DOMAIN=

name2="www"

append DOMAIN "$name2"

echo $DOMAIN

name2="groad"

append DOMAIN "$name2"

echo $DOMAIN

name2="net"

append DOMAIN "$name2"

echo $DOMAIN



运行输出:
# sh append.sh
www
www groad
www groad net

append() 函数解析

append() 函数一般接收两个参数。一般情况下,第 1 个参数用以不断接收第 2 个参数传递过来的字符串,就像不断挂接火车厢一样。如果只是接 2 个参数,那么每个字串之间使用一个空格隔开,这个从语句 local sep="${3:- }" 可以看出。因此,我们可以用第 3 个参数来指定间隔符,比如稍微修改一下测试程序的代码:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh

. /lib/functions.sh

DOMAIN=

name2="www"

append DOMAIN "$name2" "."

echo $DOMAIN

name2="groad"

append DOMAIN "$name2" "."

echo $DOMAIN

name2="net"

append DOMAIN "$name2" "."

echo $DOMAIN


那么输出为:
# sh append.sh
www
www.groad
www.groad.net

再回头看 append() 函数中的最后一句代码:

${NO_EXPORT:+-n} ,表示如果已经定义了 NO_EXPORT 且该变量不为空时使用 export 的 -n 参数,即取消后续变量的全局性(即在子 shell 中不可用)。

单独双横杠意味着后续的  \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\" 这部分内容不作为 export 的参数,而是独立部分。这句话的意思是,如果 var 为空,那么直接将 $value 赋值给 var ;如果不为空,那么它将后接第 3 个参数(不传递则默认为空格)和第 2 个参数($value)。









欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2