字符串就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)
1 字符串的表达形式
字符串有三种形式:
(1)、 由单引号包围的字符串
任何字符都会原样输出,在其中使用变量是无效的, 字符串中不能出现单引号,即使对单引号进行转义也不行
(2) 由双引号包围的字符串
如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出,字符串中可以出现双引号,只要它被转义了就行
(3)不被引号包围的字符串
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样,字符串中不能出现空格,否则空格后的字符串会作为其他变量或者命令来解析
#!/bin/bash
n=666
str1=www.baidu.com$n #不被引号包围的字符串,其中的变量会被解析
str2="shell \"stript\" $n" #被双引号包围的字符串,进行转义后,变量也能被解析
str3='hello $n' #被单引号包围的字符串,其中的变量不会被解析,而是原样输出
echo $str1
echo $str2
echo $str3
2 获取字符串的长度
在shell中获取字符串长度的方法为:#str
#!/bin/bash
str="http://www.qq.com/shell"
echo ${#str}
3 字符串的拼接
在shell中字符串的拼接不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接。
#!/bin/bash
name="shell"
url="http://www.taobao.com"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围 那么中间可以有空格
str3=$name" : "$url #中间可以出现别的字符
str4="$name : $url"
str5="${name}Script : ${url}index.html"
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
4 字符串的截取
shell中截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取
(1)从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。而且shell同时支持从字符串左边开始计数和从字符串右边开始计数的方式。
1)从字符串左边开始计数
格式
${string:start:length}
这里string是要截取的字符串
start是起始位置(从左边开始,从0开始计数)
length是要截取的长度(省略的话表示截到字符串的末尾)
2)从字符串右边开始计数
格式
${string:0-start:length}
与从字符串左边开始计数的格式基本相同,仅仅多了0-,这是固定写法,专门用来表示从字符串右边开始计数
注意:
(1) 从左边开始计数时,起始数字为0;从右边开始计数时,起始数字为1;
(2)不管从哪边开始计数,截取方向都是从左到右。
(2)从指定字符(子字符串)开始截取
注意:这种截取方式比较特殊,无法指定字符串的长度,只能从指定字符截取到字符串末尾。
1)使用#截取右边字符
使用#可以截取指定字符(或者子字符)右边的所有字符
格式
${string#*chars}
string表示要截取的字符串
chars是指定的字符(字符串)
*是通配符的一种,表示任意长度的字符串
chars*连接起来表示:忽略左边的左右字符,直到遇到chars(chars不会被截取)
上面所讲的是凡是匹配到第一个char就开始截取,但是有时候一个字符串中有好几个char,如果我们不想从第一个char截取而是想从最后一个char开始截取,那么就要使用## 格式如下:
${string##*chars}
它会一直匹配到最后一个字符,然后选最近的,按照刚才的方式进行截取
2)使用%截取左边字符
格式
${string%chars*}
这里一定要注意*的位置
截取方式:截取chars左边的字符,忽略chars右边的字符(所以*在chars右侧)
同样不会截取到指定字符chars
注意:这里的读取方式是从右往左匹配,直到遇到chars,截取它左边的字符
同样如果我们希望直到最后一个字符再匹配结束,那么需要使用%%,格式如下:
${string%%chars*}