zoukankan      html  css  js  c++  java
  • Linux shell中的一个问题 ${}带正则匹配的表达式

    目前在准备龙芯项目的PMON,在研究其编译过程的时候,看到一些make 语句,百思不得其解。后来在shell编程中看到一点资料,牵扯到Shell中的正则表达式。故记录下来,以备后来查阅。

    问题:


    在某个makefile文件中通过include引入某个文件进来

    Include $(shell ./getname)

    而getname中的内容即为:

    pwd=$(pwd);

    if [ "${pwd#*/zloader.}" = "$pwd" ];then

    echo Makefile.cpci

    else

    echo Makefile.${pwd#*/zloader.}

    fi

    一直没看懂${pwd#*/zloader.}  这个代表什么意思,后来才知道其实得到的是Make file文件的后缀名。

    如果是pwd= /xxx/yyy/zloader.bios,那么需要得到的是Makefile.bios,其中 ${pwd#*/zloader.} = bios。其中${aaa#bbb}是一个正则表达式,而'*/ '表示pwd中路径字串中zloader前面的全部部分。

    解释:

    ${parameter#pattern}

    Substitute the value of parameter with patternremoved from the left side. The smallest portion of the contents of parametermatching pattern is removed. Shell filename substitution characters (*, ?,[...], !, and @) may be used in pattern.

    在Linux下尝试一下脚本,即可证明。

    #!/bin/sh

     

    mkdir -p zloader./xxdir

    cd zloader./xxdir

     

    pwd=$(pwd)

    echo "pwd = $pwd"

     

    echo "this will substitue pwd about the patternzloader. , into NULL"

    echo "${pwd#*/zloader.}"

     

    cd ../..

    具体的说明和理论请查看以下转载文章的章节 :${}带正则匹配的表达式


    以下是转载文章

    ----------------------------------------------------------------------------Linux Shell中的参数替换----------------------------------------------------------------------------

    Bash中的$符号的作用是参数替换,将参数名替换为参数所代表的值。对于$来说,大括号是可选的,即$A和${A}代表同一个参数。

    ${}带冒号的有下面几种表达式:

    ${parameter:-word}

    如果parameter为null或者未设置,整个参数替换表达式值为word

    ${parameter:=word}

    如果parameter为null或者未设置,整个参数替换表达式值为word,并且parameter参数值设置为word

    ${parameter:?word}

    如果parameter为null或者未设置,则打印出错误信息。否则,整个参数替换表达式值为$parameter

    ${parameter:+word}

    如果parameter不为null或者未设置,则整个参数替换表达式值为word

    ${parameter:offset}

    ${parameter:offset:length}

    parameter的值的子字符串。

    可以理解下下面这几个例子:

    Linux Shell参数替换

    ${}带!有下面几种表达式:

    ${!prefix*}

    ${!prefix@}

    将带有前缀为prefix的参数名打印出来

    ${!name[@]}

    ${!name[*]}

    这个是针对name数组的,打印出来name数组有哪些下标

    可以理解下下面这几个例子:

    Linux Shell参数替换

    ${}带正则匹配的几种表达式:

    ${parameter#word}

    ${parameter##word}

    从头开始扫描word,将匹配word正则表达的字符过滤掉

    #为最短匹配,##为最长匹配

    ${parameter%word}

    ${parameter%%word}

    从尾开始扫描word,将匹配word正则表达式的字符过滤掉

    %为最短匹配,%%为最长匹配

    可以理解下面这几个例子:

    Linux Shell参数替换

    ${parameter/pattern/string}

    ${parameter//pattern/string}

    将parameter对应值的pattern字符串替换成为string字符串

    /表示只替换一次

    //表示全部替换

    可以理解下面这几个例子:

    Linux Shell参数替换

    转载部分出处: http://www.07net01.com/linux/Linux_Shellcanshutihuan_347699_1370251380.html


  • 相关阅读:
    spark定制之五:使用说明
    ElasticSearch-5.0安装head插件
    安卓真机或者模拟器运行安装应用时提示 Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]解决办法
    Elasticsearch介绍和安装与使用
    AndroidFine Error:Annotation processors must be explicitly declared now.
    Retrofit全攻略——进阶篇
    WCF基础教程之开篇:创建、测试和调用WCF
    SoapUI简介和入门实例解析
    postman的使用方法详解!最全面的教程
    Postman使用详解
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3220204.html
Copyright © 2011-2022 走看看