shell字符串

字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。它们之间是有区别的。
下面我们说一下三种形式的区别:
1) 由单引号' '包围的字符串:
任何字符都会原样输出,在其中使用变量是无效的。
字符串中不能出现单引号,即使对单引号进行转义也不行。
2) 由双引号" "包围的字符串:
如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
字符串中可以出现双引号,只要它被转义了就行。
3) 不被引号包围的字符串
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析
获取字符串长度

str="http://www.beylze.com/d/file/20190908/25x2iutcciy.html"
echo ${#str}
在 Shell 中获取字符串长度很简单,具体方法如下:
${#string_name}
string_name 表示字符串名字。
字符串拼接

str1=$name$url  #中间不能有空格
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号
字符串截取

${string: start :length}    从string字符串的左边第start个字符开始,向右截取length个字符。
${string: start}        从string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length}    从string字符串的右边第start个字符开始,向右截length 个字符。
${string: 0-start}    从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars}    从string字符串第一次出现*chars的位置开始,截取*chars右边所有字符。
${string##*chars} 从string字符串最后一次出现*chars的位置开始,截*chars右边所有字符。
${string%*chars}    从string字符串第一次出现*chars的位置开始,截取*chars左边所有字符。
${string%%*chars}    从string字符串最后一次出现*chars的位置开始,截*chars左边所有字符。

[root@snow zc]# url="c.biancheng.net"
[root@snow zc]# echo ${url: 2: 9}
biancheng
[root@snow zc]# url="c.biancheng.net"
[root@snow zc]# echo ${url: 2}  #省略 length,截取到字符串末尾
biancheng.net
[root@snow zc]# url="c.biancheng.net"
[root@snow zc]# echo ${url: 0-13: 9}
biancheng
[root@snow zc]# url="c.biancheng.net"
[root@snow zc]# echo ${url: 0-13}  #省略 length,直接截取到字符串末尾
biancheng.net
[root@snow zc]# url="http://www.beylze.com/d/file/20190908/di4r5hss02g.html"
[root@snow zc]# echo ${url#*:}
//www.beylze.com/d/file/20190908/di4r5hss02g.html
[root@snow zc]# echo ${url#*p:}
//www.beylze.com/d/file/20190908/di4r5hss02g.html
[root@snow zc]# echo ${url#*ttp:}
//www.beylze.com/d/file/20190908/di4r5hss02g.html
[root@snow zc]# echo ${url#http://}
www.beylze.com/d/file/20190908/di4r5hss02g.html
[root@snow zc]# echo ${url#*/}
/www.beylze.com/d/file/20190908/di4r5hss02g.html
[root@snow zc]# echo ${url##*/}
di4r5hss02g.html
[root@snow zc]# echo ${url%/*}
http://www.beylze.com/d/file/20190908
[root@snow zc]# echo ${url%%/*}
http:
[root@snow zc]#

最后,我们对以上 8 种格式做一个汇总,请看下表:

格式

说明

${string: start :length}

从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。

${string: start}

从 string 字符串的左边第 start 个字符开始截取,直到最后。

${string: 0-start :length}

从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。

${string: 0-start}

从 string 字符串的右边第 start 个字符开始截取,直到最后。

${string#*chars}

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

${string##*chars}

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

${string%*chars}

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

${string%%*chars}

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。不管从哪边开始计数,截取方向都是从左到右。

原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/13155809.html