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编程中,经常要处理一些字符串变量。比如,计算长度啊、截取子串啊、字符替换啊等等,常常要用到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
说说遇到过的坑,
- 原来使用了单引号把 -e后面的参数可包裹起来, 遇到${var}不能被展开的问题, 后来发现使用双引号或者不用引号就没有问题
- 遇到替换过后的字符串有/, 需要进一步转义, 所以有了{var////\/}}