shell脚本字符串处理若干

作者: 钢铁油腻男 | 来源:发表于2019-08-21 14:09 被阅读7次

    bash中冒号的用法


    转载的

    ${parameter:-word}    如果parameter没有设置或者为空,替换为word;否则替换为parameter的值。
    ${parameter:+word}    如果parameter没有设置或者为空,不进行任何替换;否则替换为word。
    ${parameter:=word}    如果parameter没有设置或者为空,把word赋值给parameter。最终替换为parameter的值。
    ${parameter:?word}    如果parameter没有设置或者为空,把word输出到stderr,否则替换为parameter的值。
    ${parameter:offset}    扩展为parameter中从offset开始的子字符串。
    ${parameter:offset:length}     扩展为parameter中从offset开始的长度不超过length的字符。
    

    例子如下:

    $ foo=hellobash
    $ echo ${foo}
    hellobash
    $ echo ${foo:-newword}
    hellobash
    $ echo ${foo}
    hellobash
    $ echo ${foo:+newword}
    newword
    $ echo ${foo}
    hellobash
    $ echo ${foo:?newword}
    hellobash
    $ echo ${foo}
    hellobash
    $ echo ${foo:=newword}
    hellobash
    $ echo ${foo}
    hellobash
    $ unset foo
    $ echo ${foo}
    
    $ echo ${foo:-newword}
    newword
    $ echo ${foo}
    
    $ echo ${foo:+newword}
    
    $ echo ${foo}
    
    $ echo ${foo:?newword}
    bash: foo: newword
    $ echo ${foo}
    
    $ echo ${foo:=newword}
    newword
    $ echo ${foo}
    newword
    $ echo ${foo:2}
    wword
    $ echo ${foo:2:3}
    wwo
    

    ————————————————
    前半部分转至:
    版权声明:本文为CSDN博主「aidear_evo」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/iEearth/article/details/52589020



    附加说明:

    在书写脚本的时候, 如ci, 就可以根据

    variables:
      REGISTRY_IMAGE: ${REGISTRY_IMAGE:-${CI_PROJECT_NAME}}
    

    这样来实现简单的 if REGISTRY_IMAGE else CI_PROJECT_NAME


    字符串处理技巧

    SHELL字符串处理技巧(${}、##、%%)

    在SHELL编程中,经常要处理一些字符串变量。比如,计算长度啊、截取子串啊、字符替换啊等等,常常要用到awk、expr、sed、tr等命令。下面给大家介绍个简单的字符串处理方法,用不着嵌套复杂的子命令。

    ${#VALUE}:计算VALUE字符串的字符数量。
    ${VALUE%.*}或${VALUE%%.*}:删除VALUE字符串中以分隔符“.”匹配的右边字符,保留左边字符。
    ${VALUE#*.}或${VALUE##*.}:删除VALUE字符串中以分隔符“.”匹配的左边字符,保留右边字符。
    ${VALUE/OLD/NEW}或${VALUE//OLD/NEW}:用NEW子串替换VALUE字符串中匹配的OLD子串。
        补充:“*”表示通配符,用于匹配字符串将被删除的字串。“.”表示字符串中分隔符,可以为任意一个或多个字符。“%”表示从右向左匹配,“#”表示从左向右匹配,“\”表示替换,都属于非贪婪匹配,即匹配符合通配符的最短结果。与“%”、“#”和“/”类似的有“%%”、“##”和“//”,都属于贪婪匹配,即匹配符合通配符的最长结果。
    
    ${VALUE:OFFSET}或${VALUE:OFFSET:LENGTH}:从VALUE字符串的左边开始中截取子串。
    ${VALUE:0-OFFSET}或${VALUE:0-OFFSET:LENGTH}:从VALUE字符串的右边开始中截取子串。
        补充:左边第一个字符从“0”开始,右边第一个字符从“0-1”开始。 表示偏移OFFSET个字符开始,LENGTH表示要截取字符的长度。如果没有LENGTH变量,表示偏移OFFSET个字符开始到字符串结束。
    
    ${VALUE:-WORD}:当变量未定义或者值为空时,返回值为WORD的内容,否则返回变量的值。
    ${VALUE:=WORD}:当变量未定义或者值为空时,返回WORD的值的同时并将WORD赋值给VALUE,否则返回变量的值。
    ${VALUE:+WORD}:当变量已赋值时,其值才用WORD替换,否则不进行任何替换。
    ${VALUE:?MESSAGE}:当变量已赋值时,正常替换。否则将消息MESSAGE送到标准错误输出(若此替换出现在SHELL程序中,那么该程序将终止运行)。
        补充:WORD可以为一个字符串,也可以为一个变量。当为变量时,需要用“$”引用该变量。
    

    在ci下使用sed命令替换文件中的内容

    直接上代码

    - sed -e s/{REGISTRY_IMAGE}/${REGISTRY_IMAGE}/g -e s/{PUBLIC_PATH}/${PUBLIC_PATH//\//\\\/}/g -e s/{PUBLIC_PATH_NO_DASH}/${PUBLIC_PATH_NO_DASH//\//\\\/}/g docker-compose-${DEPLOY_VERSION}.yml > /foo/${DOCKER_COMPOSE_DIR}/docker-compose.yml
    

    说说遇到过的坑,

    1. 原来使用了单引号把 -e后面的参数可包裹起来, 遇到${var}不能被展开的问题, 后来发现使用双引号或者不用引号就没有问题
    2. 遇到替换过后的字符串有/, 需要进一步转义, 所以有了{var/斜杠//转义斜杠}, 就是{var////\/}}

    相关文章

      网友评论

        本文标题:shell脚本字符串处理若干

        本文链接:https://www.haomeiwen.com/subject/qfbbsctx.html