本文介绍: 以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除

一、定义字符串方法

(1)字符串(String)就是一系列字符组合

(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"

双引号字符串的特点:

(1)双引号里面可以变量,如果包含了某个变量,那么该变量会被解析,即得到该变量的值,而不是原样输出

(2)双引号里面可以出现双引号,只要它被转义了就行。

3、无引号

(1)不被引号包围的字符串中出现变量时也会被解析,这一点和双引号包围的字符串一样。

(2)字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

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 的引用

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

二、字符串的相关操作

1、获取字符串的长度

在 Shell 中获取字符串长度简单,具体方法如下:

${#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进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注