shell中的字符串

41 篇文章 0 订阅

1. 字符串的形式

在shell中字符串有三种形式:

  • 由单引号’ '包围的字符串
    任何字符都会原样输出,在其中使用变量是无效的
    字符串中不能出现单引号,即使对单引号进行转义也不行

  • 由双引号" "包围的字符串
    如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出
    字符串中可以出现双引号,只要它被转义了就行

  • 不被引号包围的字符串
    不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样
    字符串中不能出现空格,否则空格后面的字符串会作为其他变量或者的命名解析

具体区别演示

#!/bin/bash
n=88
str1=www.baidu.com$n str2="shell \"stript\" $n"
str3='你好 $n'
echo $str1
echo $str2
echo $str3

在这里插入图片描述
str1中包含了 $n,它被解析为变量n的引用。 $n 后边有空格,紧随空格的是str2 ;Shell将str2解释为一个新的变量名,而不是作为字符串str1的一部分。

str2中包含了引号,但是被转义了(由反斜杠\ 开头的表示转义字符) 。str2中也包含了 $n,它也被解析为变量n的引用。

str3中也包含了 $n,但是仅仅是作为普通字符,并没有解析为变量n的引用。

2. 获取字符串长度

#str 获取字符串长度

#!/bin/bash
str="http://www.baidu.com/shell"
echo ${#str}

在这里插入图片描述

3. shell字符串拼接

在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

在这里插入图片描述

在str1中 $name 和 $url之间之所以不能出现空格,是因为当字符串不被任何一种引号包围时,遇到空格就认为字符串结束了,空格后边的内容会作为其他变量或者命令解析。

Shell这种拼接字符串的方式和Python非常类似,Python既支持用+拼接字符串,也支持将两个字符串放在一起。

4. shell字符串截取

shell截取字符串通常有两种方式:

  • 从指定位置开始截取
  • 从指定字符(子字符串)开始截取

4.1 从指定位置开始截取

这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。

既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是Shell同时支持两种计数方式。

1)从字符串左边开始计数

格式

${string: start: length}
sting是要截取的字符串;
start是起始位置(从左边开始,从0开始计数);
length是要截取的长度(省略的话表示截到字符串的末尾)

在这里插入图片描述

2)从字符串右边开始计数

格式

${string: 0-start :length}
同上面格式相比,这种格式仅仅多了0-,这是固定的写法,用来表示从字符串右边开始计数

在这里插入图片描述

注意:

  • 从左边开始计数时,起始数字为0;从右边开始计数时,其实数字为1;
  • 不管从哪边开始计数,截取方向都是从左到右

4.2 从指定字符(子字符串)开始截取

这种截取方式无法指定字符串的长度,只能从指定字符截取到字符串末尾。

1)使用#号截取右边字符
使用#号可以截取指定字符(或者子字符串)右边的所有字符

格式

${string#*chars}

string表示要截取的字符串
chars是指定的字符(或者子字符串)
*是通配符的一种,表示任意长度的字符串
*chars连接起来表示:忽略左边的左右字符,直到遇到chars(chars不会被截取)

在这里插入图片描述

注意:以上写法遇到第一个与指定字符匹配的字符就结束了

在这里插入图片描述
上图包含了好几个/,但是它遇到第一个/时就结束匹配了

如果希望直到最后一个指定字符再匹配结束,就可以使用##
具体格式

${string##*chars}
它会一直匹配到最后一个字符,然后选最近的,按照刚才的方式进行截取

在这里插入图片描述

2)使用%截取左边字符
使用%号可以截取指定字符(或者子字符串)左边的所有字符

格式:

${string%chars*}

这里一定要注意*的位置
截取方式:截取chars左边的字符,忽略chars右边的字符(所以*在chars右侧)
同样不会截取到指定字符chars

在这里插入图片描述

注意:这里的读取方式是从右往左匹配,直到遇到chars,截取它左边的字符
它遇到从右边开始的第一个指定字符就停止匹配了,如下图示例:
在这里插入图片描述

如果希望直到最后一个指定字符再匹配结束,就可以使用%%,具体格式:

${string%%chars*}

在这里插入图片描述

最后:一定要注意用#截取是从左向右读;用%截取时是从右向左读

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值