前言
字符串,所有编程语言都有的概念,本质为一组字符组成的序列,在shell编程中更特别,因为字符串是shell中唯一的数据类型,哪怕你看到的是一个数字,它也是字符串,比如100
first=100
100虽然是个数字,但它再shell中也是字符串,因为字符串是shell中唯一的数据类型(备注:理解为shell没有数据类型,只有字符串)
创建字符串的3种方式
1、无引号
first=hello
2、单引号
first='hello'
3、双引号
first="hello"
无引号:所有特殊字符保留作用
单引号:所有字符原样输出,所有特殊字符全部失去作用,且单词分隔功能失效,比如$、比如$()
双引号:支持变量替换、命令替换,其它所有字符会原样输出,且单词分隔功能失效
(备注:shell以IFS环境变量修饰的字符作为单词的分隔符,IFS的默认值是:空格字符、换行字符、制表符)
单词分隔
first=hello
shell编程中,以IFS的默认值称为空白字符(换行、空格、制表,一共3个空白字符),空白字符作为单词分隔的字符,而单引号与双引号,均可让单词分割功能失效,当我们需要包括空格字符的时候,则必须使用单引号或者双引号将字符串括起来。
second="hello world"
此时由于双引号的存在,单词分隔功能失效,所以"hello world"成为一个整体,而不再是单独的2个单词
字符串长度的获取
str="wang"
echo ${#str}
请严格遵守标准的语法:${#变量名},因为#在shell编程中是个特殊变量名,表示命令行参数的个数
字符串拼接
其它语言使用+号拼接字符串,shell编程中,只要字符串挨着即为拼接,无需+号
a=wang
b=yuan
c=$a$b
解读代码:c=$a$b
1、先做变量值替换,所以$a会替换为wang、$b会被替换yuan
2、接着开始拼接为一个字符串wangyuan
3、结果再次赋值给变量c
紧紧的挨着字符串,即可完成字符串拼接,省去了其它语言常用的+号
理解字符串拼接
Java
String first = "hi";
String second = "man"
String result = first + second;
Java或者其他语言,总使用+号作为字符串拼接的连接符,而shell编程不需要任何字符作为连接符,字符串之间紧紧需要挨着即为拼接
Shell
first=hi
second=man
result=$first$second
一般情况下单词中间要有个空白字符,所以此时必须使用单引号或者双引号,使单词分隔功能失效,这样才能拼接为一个字符串,且包括空白字符,否则单词分隔功能一旦开始工作,会让bash认为第一个单词为命令,后面的单词为传递给命令的参数,从而引起错误(这个shell编程的标准,规定第一个单词是命令)
Shell
first=hi
second=man
result="$first $second"
大小写
# 转为大写
${varname^^}
# 转为小写
${varname,,}
英文字符,经常有转换大小写的概念,参照语法实现即可,注意:原始的变量值并不会改变,除非你再次赋值
子串操作
从一个字符串中,提取一部分字符串,称为子串操作
1、从头部开始截取子串
注意:
1、原始变量值不变
2、不是正则
3、匹配不成功,返回原始字符串
4、匹配成功,匹配部分被删除,返回剩下的字符串
${variable#pattern}
temp=helloworld
echo ${temp#hello}
输出:
world
2、从尾部截取子串
注意:
1、原始字符串值不变
2、不是正则
3、匹配不成功,返回原始字符串
4、匹配成功,匹配的部分会被删除,返回剩下的子串
结尾
1、如果 pattern 匹配变量的结尾,删除最短匹配的部分,返回剩余部分
${variable%pattern} (非贪婪匹配,使用一个%)
$ echo ${my_hello%ld}
hellowor
$ echo ${my_hello%w*}
hello
指定下标截取子串
序列的下标的从0开始,字符串作为序列,同时以0开始
1、基本语法
${varname:offset:length}
2、来个例子
#!/bin/bash
demo=helloworld
echo ${demo:1:4}
${demo:1:4}的解释
变量名为demo
起始下标为1
截取的字符串长度4
所以最后的输出:
ello
3、不会改变原始字符串,只是提取出来一段子串
${demo:1:4}
demo指向的字符串并没有任何改变
4、可以省略字符串长度,表示到字符串末尾
${demo:1}
输出:
elloworld
字符串替换
1、从字符串的头部开始替换(只替换匹配的第一个)
demo="helloworldworld"
echo ${demo/#world/love}
输出:
helloloveworld
2、从字符串的尾部开始替换(只替换匹配的第一个)
demo="helloworldworld"
echo ${demo/%world/love}
输出:
helloworldlove
3、从字符串的中间开始替换(只替换一个)
demo="helloworldworld"
echo ${demo/world/love}
输出:
helloloveworld
4、从字符串的中间替换(替换所有)
demo="helloworldworld"
echo ${demo//world/love}
输出:
hellolovelove
总结
1、字符串拼接,不需要额外的+号,仅需挨着放在一起即为拼接,现在想想其他语言使用+号拼接是不是多此一举?
2、常常使用双引号修饰字符串,因为双引号中可以使用变量替换、命令替换、且又能完成带有空白空白字符的字符串拼接
3、shell编程中只有字符串一种数据类型,你看到每个都是字符串,包括看到的数字