以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。
一、定义字符串的方法
(2)字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
(3)在shell变量的定义里已经讲过这些内容,这里重提是为了加深印象。
1、单引号
str='this is a string'
(1)单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。
(2)单引号字串中不能出现单引号,即使对单引号使用转义符后也不行。
2、双引号
your_name='qinjx' str="Hello, I know your are "$your_name"! n"
双引号字符串的特点:
3、无引号
4、实例说明
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash n=74 str1=c.biancheng.net$n str2="shell "script" $n" str3='C语言中文网 $n' echo $str1 echo $str2 echo $str3 xjh@ubuntu:~/iot/tmp$ ./test.sh c.biancheng.net74 shell "script" 74 C语言中文网 $n xjh@ubuntu:~/iot/tmp$
(1)str1 中包含了
$n
,它被解析为变量 n 的引用。$n
后边有空格,紧随空格的是 str2;Shell 将 str2 解释为一个新的变量名,而不是作为字符串 str1 的一部分。(2)str2 中包含了引号,但是被转义了(由反斜杠
开头的表示转义字符)。str2 中也包含了
$n
,它也被解析为变量 n 的引用。
二、字符串的相关操作
1、获取字符串的长度
${#string_name} #string_name 表示字符串的名字
xjh@ubuntu:~/iot/tmp$ cat test.sh string="abcd" echo ${#string} xjh@ubuntu:~/iot/tmp$ ./test.sh 4 xjh@ubuntu:~/iot/tmp$
2、字符串的拼接
在 Shell 中不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接,非常简单粗暴。
xjh@ubuntu:~/iot/tmp$ cat test.sh #!/bin/bash name="Shell" url="http://c.biancheng.net/shell/" 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 xjh@ubuntu:~/iot/tmp$ ./test.sh Shellhttp://c.biancheng.net/shell/ Shell http://c.biancheng.net/shell/ Shell: http://c.biancheng.net/shell/ Shell: http://c.biancheng.net/shell/ ShellScript: http://c.biancheng.net/shell/index.html xjh@ubuntu:~/iot/tmp$
3、截取字符串
Shell 截取字符串通常有两种方式:从指定位置开始截取、从指定字符(或子字符串)开始截取。
(1)从指定位置开始截取
这种方式需要明确两个参数,即起始位置截取长度。另外还要明确计数方向,即到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是 Shell 同时支持两种计数方式。
1)如果从字符串左边开始计数,则截取字符串的具体格式如下,其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
${string:start:length}
xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash
string="alibaba is a great company"
echo ${string:1:4}
xjh@ubuntu:~/iot/tmp$ ./test.sh
liba
xjh@ubuntu:~/iot/tmp$
2)如果从字符串的右边开始计数,那么截取字符串的具体格式如下。与从字符串左边开始计数的格式相比,这种方式仅仅多了0-
,这是固定的写法,专门用来表示从字符串右边开始计数。
${string:0-start:length}
这里需要强调两点:
xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash
string="alibaba is a great company"
echo ${string:0-13:5} #从右边数,g是第13个字符
echo ${string:0-13} #省略length,则直接截取到字符串末尾
xjh@ubuntu:~/iot/tmp$ ./test.sh
great
great company
xjh@ubuntu:~/iot/tmp$
(2)从指定字符(或子字符串)开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
1) 使用 # 号截取右边字符
使用#
号可以截取指定字符(或者子字符串)右边的所有字符,具体格式如下。其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),*
是通配符的一种,表示任意长度的字符串。*chars
连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。
另外,这是从左往右开始匹配的。
${string#*chars}
xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*:} #截取“:”这个字符后面的字符串(不包括冒号本身)
echo ${url#*p:} #截取“p:”这个子字符串后面的字符串
echo ${url#*ttp:}
echo ${url#*/} #url字符串中有三个/,但Shell遇到第一个/就匹配结束了
xjh@ubuntu:~/iot/tmp$ ./test.sh
//c.biancheng.net/index.html
//c.biancheng.net/index.html
//c.biancheng.net/index.html
/c.biancheng.net/index.html
xjh@ubuntu:~/iot/tmp$
注意到上面的例子最后一个输出中,遇到第一个匹配的字符(子字符串)就结束了。如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用##
,具体格式为:
${string##*chars}
xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*/} #结果为 /c.biancheng.net/index.html
echo ${url##*/} #结果为 index.html
str="---aa+++aa@@@"
echo ${str#*aa} #结果为 +++aa@@@
echo ${str##*aa} #结果为 @@@
xjh@ubuntu:~/iot/tmp$ ./test.sh
/c.biancheng.net/index.html
index.html
+++aa@@@
@@@
xjh@ubuntu:~/iot/tmp$
2)使用 % 截取左边字符
使用%
号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下。因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*
应该位于 chars 的右侧。其他方面%
和#
的用法相同,这里不再赘述。
${string%chars*}
xjh@ubuntu:~/iot/tmp$ cat test.sh
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url%/*} #从右往左匹配,第一次出现/的地方为“/index.html”这里的/
echo ${url%%/*} #从右往左匹配,最后一次出现/的地方为“//c.biancheng ”这里的/
str="---aa+++aa@@@"
echo ${str%aa*}
echo ${str%%aa*}
xjh@ubuntu:~/iot/tmp$ ./test.sh
http://c.biancheng.net
http:
---aa+++
---
xjh@ubuntu:~/iot/tmp$
(3)不同截取格式的总结
格式 | 说明 |
---|---|
${string: start :length} | 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 |
${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后。 |
${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 |
${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后。 |
${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string%chars*} | 从 string 字符串第一次出现 chars* 的位置开始,截取 chars*左边的所有字符。 |
${string%%chars*} | 从 string 字符串最后一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。 |
原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/125587975
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_12175.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!