openwrt里面的高深代码-两行shell脚本

来看下shell脚本里面定义的如下函数
# config_get <variable> <section> <option> [<default>]
# config_get <section> <option>
config_get() {
    case "$3" in
        "") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
        *)  eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
    esac
}

解释:
首先需要了解前面一些知识
1、eval
    eval不容易解释懂。简单理解就是,eval会首先对表达式的参数进行一次解析处理,处理完毕后再执行这个表达式。举几个简单的例子:
    先看下字符串里使用变量的情况
    $ abc=123
    $ echo "$abc"
    $ 123
    $ echo "\$abc"
    $ $abc
    再结合eval看看
    $ eval echo "$abc"
    $ 123 
    处理过程:首先eval处理参数, $abc被替换为123,然后执行echo "123",再看下面的命令
    $ eval echo "\$abc"
    $ 123
    处理过程:首先eval处理参数,"\$abc"被处理为"$abc",然后执行echo "$abc",执行的echo的时候$abc被解析处理为"123",打印得到123

2、shell内置的字符串处理
    ${string:-word}: 如果string没设定或为空值,则使用word作为返回值(非空值时不做处理)
     ${string:+word}: 如果string为非空值,则使用word作为返回值(没设定或空值时不做处理)

3、export参数
    export 支持-n参数,删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。 

4、shell里面--含义
    shell里面--表示命令选项结束,--后面的参数都将被视为位置参数,例如
    grep -r -n "123" test.txt    //这是一句正常的grep语句
    grep -r -- -n "123" test.txt     //-n由于写在--后面,所以-n不会被理解为grep的命令选项,而是理解为一个位置参数,即表示在123文件中grep "-n"这个字符串

再回头来解释这行代码
eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
假设入参$1=CONFIG_WIFI_ON, $2=WIFI, $3=ON, $4=n, NO_EXPORT=1
首先处理eval,解析export表达式参数,解析完为 export -n -- "CONFIG_WIFI_ON=${CONFIG_WIFI_ON:-${4}}"
假设CONFIG_WIFI_ON被定义为y,那么表达式简化为 export -n -- "CONFIG_WIFI_ON=y"
假设CONFIG_WIFI_ON没被定义,那么表达式简化为 export -n -- "CONFIG_WIFI_ON=n"
export里面-n表示删掉后面的环境变量,--表示命令行选项结束。
整个表达式的语句表示,如果定义了NO_EXPORT那么删掉这个环境变量,否则设置这个环境变量

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013401853/article/details/80345846
文章标签: openwrt eval shell
个人分类: openwrt
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭