在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。
判断读取字符串值
- ${var} 变量var的值, 与$var相同
- ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
- ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
- ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
- ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
- ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
- ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
- ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
- ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
- ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
- ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量
加入了“*” 不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.
字符串操作
- ${string:position} 在string中, 从位置$position开始提取子串
- ${string:position:length} 在string中, 从位置$position开始提取长度为length的子串
- ${string#substring} 从变量string的开头, 删除最短匹配substring的子串
- ${string##substring} 从变量string的开头, 删除最长匹配substring的子串
- ${string%substring} 从变量string的结尾, 删除最短匹配substring的子串
- ${string%%substring} 从变量string的结尾, 删除最长匹配substring的子串
- ${string/substring/replacement} 使用replacement, 来代替第一个匹配的substring
- ${string//substring/replacement} 使用replacement, 代替所有匹配的substring
- ${string/#substring/replacement} 如果string的前缀匹配$substring, 那么就用replacement来代替匹配到的substring
- ${string/%substring/replacement} 如果string的后缀匹配$substring, 那么就用replacement来代替匹配到的substring
说明:”* $substring”可以是一个正则表达式.
实例
读取
1 | echo ${abc-'ok'} |
取得字符串长度
1 | string=abc12342341 //等号二边不要有空格 |
字符串所在位置
1 | expr index $string '123' //结果4 字符串对应的下标是从1开始的 |
字符串截取
1 | echo ${string:4} //2342341 从第4位开始截取后面所有字符串 |
匹配显示内容
1 | //例3中也有match和这里的match不同,上面显示的是匹配字符的长度,而下面的是匹配的内容 |
这里括号的用法,是不是根其他的括号用法有相似之处呢,
截取不匹配的内容
1 | echo ${string#a*3} //42341 从$string左边开始,去掉最短匹配子串 |
获取文件名
1 | url="https://dl.google.com/go/go1.12.darwin-amd64.tar.gz" |
1 | str="abbc,def,ghi,abcjkl" |
这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面) 。
匹配并且替换
1 | echo ${string/23/bb} //abc1bb42341 替换一次 |
1 | str="apple, tree, apple tree" |
比较
1 | [[ "a.txt" == a* ]] # 逻辑真 (pattern matching) |
连接
1 | s1="hello" |
字符串删除
1 | test='c:/windows/boot.ini' |