Shell(3):字符串
1、单双引号
单引号:原样输出写的内容,没有变量和转义;
双引号:其中存在变量和转义;
说明
字符串串首的空格在显示时会被屏蔽,但是在统计长度和后续一系列有关字符串的方法时都会计入。
2、字符串拼接
用法:$a$b
例子
a="chuan" b="chuan"
c=" $a$b"
d="$a""chuan"
e=$a"chuan"
#cde都代表chuanchuan
3、字符串长度
用法:${#变量名}
例子:
a="chuan" b="chuan" c="$a$b" echo $c echo ${#c}
11
4、切片
用法:${变量名:起:数}
说明:从起始位置(包含,从0开始)开始,截取指定数量的字符
例子:
c=" aabb" echo $c echo ${a:1:3} aab
注意这里,虽然串首的空格不会被显示,但是在统计时依然会计入
5、字符串运算符
运算符 |
说明 |
例子注意①[ ]与左右表达式之间的空格 ②表达式 与 运算符之间的空格 |
= | 两个字符串是否相等,是则返回true | [ $a = $b ] |
!= | 两个字符串是否相等,否则返回true | [ $a != $b ] |
-z | 字符串长是否为0,是则返回true | [ -z $a ] |
-n | 字符串长是否为0,否则返回true | [ -n $a ] |
str (无运算符) |
字符串是否为空,不为空则返回true | [ $a ] |
包含:~与!~,字符串是否包含子串
例子:字符串变量A是否包含子串abc?是返回1,否返回0
r=A~"abc" if(r==0)print "true" else print "false"
6、正则表达式
元字符 |
说明 |
例子 |
\ | 转义符,将特殊字符转为一般字符 | a\.b 只能匹配 a.b |
^ | 匹配开头 | ^tux 匹配以tux开头的行 |
$ | 匹配结尾 | tux$ 匹配以tux结尾的行 |
. | 除换行符\n外的任意单个字符 | ab.匹配任意ab+单字符 |
[ ] | 匹配[ ]中的任意单字符 |
coo[kl]匹配cook和cool |
[^] | 匹配除了[^ ]列出的单字符 | 123[^45]匹配123x,x是除了4和5外的其他任意字符 |
[-] | 匹配某个范围内的字符(必须递增) | [0-9]可以匹配0-9的任意单个数字 |
? | 匹配之前的项0或1次 | colou?r可以匹配0或1次u,即color或colour |
+ | 匹配之前的项1或多次 | sa-6+可以匹配多个6,即sa-6、sa-666 |
* | 匹配之前的项人一次 | co*l可以匹配任意个o,即col、cool、coool |
() | 匹配某个子串 | ma(trix)?可以匹配matrix和ma |
{n} | 匹配之前的项n次 | [0-9]{3}可以匹配任意三位数 |
{n,} | 至少匹配之前的项n次 | [0-9]{2,}匹配一个两位或以上的数 |
+n,m} | 最少匹配n次,最多匹配m次 | [0-9]{2,5}匹配一个2至5位数 |
| | 或 | ab(c|d)匹配c或d,即abc和abd均可 |
7、cut:列提取
用法
cut [选项] 文件名
选项
选项 |
说明 |
-f |
列号;提取第几列 多列用逗号,分隔,如cut -f 2,3 |
-d | 分隔符;以指定分隔符分割列 |
-n | 取消分割多字节字符 |
-c |
字符范围();不依赖分隔符来区分列,而是通过字符范围(从第几个字符开始分割)进行字符提取: n-:从第n个字符到行尾; n-m:从第n到第m个字符; -m:从第一个到第m个字符; |
--complement | 补全被选择的字符或字段 |
--out-delimiter | 输出内容为字段分隔符 |
说明:
- 默认分隔符为制表符,即TAB。
例子
-
创建文件
[root@localhost ~]$ vi student.txt
id name gender mark
1 liming m 86
2 sc m 67
3 tg n 90
-
分割
[root@localhost ~]$ vi student.txt
id name gender mark
1 liming m 86
2 sc m 67
3 tg n 90
[root@localhost ~]$ cut -f 2 student.txt
#提取第二列内容
[root@localhost ~]$ cut -f 2,3 student.txt
#提取第2和3列的内容
[root@localhost ~]$ cut -c 8- student.txt
#每行从第八个字符开始提取到行尾,好像很乱啊,那是因为每行的字符个数不相等啊
8-:提取到行尾
8:提取第8个
-8:从行首提取到第8个
[root@localhost ~]$ cut -d ":" -f 1,3 /etc/passwd
#以“:”作为分隔符,提取/etc/passwd_文件的第一列和第三列
8、split:字符串分割
用法:split(列,结果数组,分隔符)
例子:l=split($2,arr,"#")
说明:用指定分隔符对某列所有字符串进行分割,分割结果保存于结果数组中
参数:
- $2:对哪一列进行分割;
- arr:分割后保存而成的字符串数组;
- "#":分隔符;写法:"分隔符",如"/",":","#"
返回值:分割成的数组长度,arr的长度,可通过arr[l]访问最后一号元素
例子:
/etc/passwd的文件组织形式如下
将文件的最后一列进行分割(/sbin/nologin),提取分割后的最后一个元素
l=split($7,arr,"/") canlogin=arr[l]~"nologin" if(canlogin==0)canlogin="true" else canlogin="false"
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性