shell之字符串

shell中数据类型一般指数值,字符串,数组。

一、字符串的定义

用双引号,单引号,或者直接在接在=后,都可以定义一个字符串,如下,定义了三个字符串

str1="this is a string" 
str2='this is a string'
str3=this_is

但双引号和单引号,在bash中还是有区别的。
单引号引用,则保留字符串的所有字符的字面含义,同时,单引号内不允许再出现单引号,也不会对转义字符等进行转义。
双引号引用,则支持一些扩展,如$(美元符) \ (反斜杠)。\$可以引用后面的变量值,\(反斜杠)表示转义。

二、求字符串长度

str="test_string"
1.echo ${#str} #得到长度9
2.expr length $str   # 9
3.expr "$str" : ".*" # 9  
备注: .*代表任意字符,即用任意字符来匹配字符串,结果是匹配到9个,即字符串的长度为9
4.echo ${str} | awk '{print length($0)}'
5.echo $str | awk -F "" '{print NF}'  备注: -F为分隔符,NF为域的个数,即单行字符串的长度
6.echo $str| wc -L
备注: -L参数
1) 对多行文件来说,表示打印最长行的长度! 
2) 对单行字符串而言,表示当前行字符串的长度!
7.echo -n $str| wc -c
备注:
1) -c参数: 统计字符的个数
2) -n参数: 去除"\n"换行符,不去除的话,默认带换行符

三、 读取字符串值

表达式含义
${var}变量var本来的值
${var-default}var没声明返回default,但不改变var的值
${var:-default}var没声明或其值为空返回default,但不改变var的值
${var=default}var没有声明返回default,并将var的值设置为default
${var:=default}var没声明或其值为空返回default,并将var的值设置为default
${var+other}var被声明返回other,但不改变var的值
${var:+other}var被声明且不为空返回other,但不改变var的值
${var?err_msg}var没有被声明,将消息err_msg送到标准错误输出
${var:?err_msg}var没声明或者为空,将消息err_msg送到标准错误输出
${!varprefix*}匹配之前全部以varprefix开头进行声明的变量
${!varprefix@}匹配之前全部以varprefix开头进行声明的变量

四、 字符串操作

表达式含义
${#string}string的长度
${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. 查找子串的位置

str="abc"
expr index $str "a"  # 1
expr index $str "b"  # 2
expr index $str "x"  # 0
expr index $str ""   # 0

2. 选取子串

str="abcdef"
expr substr "$str" 1 3  # 从第一个位置开始取3个字符, abc
expr substr "$str" 2 5  # 从第二个位置开始取5个字符, bcdef
expr substr "$str" 4 5  # 从第四个位置开始取5个字符, def
echo ${str:2}           # 从第二个位置开始提取字符串, bcdef
echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd
echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde
echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde

3. 截取子串

str="abbc,def,ghi,abcjkl"
echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)
echo ${str##a*c}    # 输出jkl,             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"}   # 输出abbc,def,ghi,abcjkl 因为str中没有"a*c"子串
echo ${str##"a*c"}  # 输出abbc,def,ghi,abcjkl 同理
echo ${str#*a*c*}   # 空
echo ${str##*a*c*}  # 空
echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl,
echo ${str#*d*f}    # 输出,ghi,abcjkl
echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配
echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配
echo ${str%a*c}     # abbc,def,ghi,abcjkl
可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面) 

4. 字符串替换

str="apple, tree, apple tree"
echo ${str/apple/APPLE}   # 替换第一次出现的apple
echo ${str//apple/APPLE}  # 替换所有apple
echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它

5. 比较

[[ "a.txt" == a* ]]        # 逻辑真 (pattern matching)
[[ "a.txt" =~ .*\.txt ]]   # 逻辑真 (regex matching)
[[ "abc" == "abc" ]]       # 逻辑真 (string comparision)
[[ "11" < "2" ]]           # 逻辑真 (string comparision), 按ascii值比较

6. 连接

s1="hello"
s2="world"
echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值