字符串
2023-1-19
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash 都视为字符串。
 

转义

某些字符在Bash里有特殊含义(比如$&*)。
输出$date不会有任何结果,因为$是一个特殊字符。如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这就叫做转义(escape)
 
反斜杠本身也是特殊字符,如果想要原样输出反斜杠,就需要对它自身转义,连续使用两个反斜线(\\)。
 
反斜杠除了用于转义,还可以表示一些不可打印的字符。
  • \a:响铃
  • \b:退格
  • \n:换行
  • \r:回车
  • \t:制表符
如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用echo命令的-e参数。
 
换行符是一个特殊字符,表示命令的结束,Bash 收到这个字符以后,就会对输入的命令进行解释执行。换行符前面加上反斜杠转义,就使得换行符变成一个普通字符,Bash 会将其当作长度为0的空字符处理,从而可以将一行命令写成多行。
如果一条命令过长,就可以在行尾使用反斜杠,将其改写成多行。这是常见的多行命令的写法。
 

引号

单引号

Bash允许字符串放在单引号或双引号之中,加以引用。单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(*)、美元符号($)、反斜杠(\)等。
 
由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($),然后再对里层的单引号转义。
更合理的方法是改在双引号之中使用单引号:
 

双引号

双引号比单引号宽松,大部分特殊字符在双引号里面,都会失去特殊含义,变成普通字符。
通配符*是一个特殊字符,放在双引号之中,就变成了普通字符,会原样输出。这意味着,双引号里面不会进行文件名扩展。
但是,三个特殊字符除外:美元符号($)、反引号(`)和反斜杠(\)。这三个字符在双引号之中,依然有特殊含义,会被 Bash 自动扩展。
美元符号($)和反引号(`)在双引号中,都保持特殊含义。美元符号用来引用变量,反引号则是执行子命令。
 
反斜杠在双引号之中保持特殊含义,用来转义。所以,可以使用反斜杠,在双引号之中插入双引号,或者插入反斜杠本身。
 
换行符在双引号之中,会失去特殊含义,Bash 不再将其解释为命令的结束,只是作为普通的换行符。所以可以利用双引号,在命令行输入多行文本。
Bash 正常情况下会将换行符解释为命令结束,但是换行符在双引号之中就失去了这种特殊作用,只用来换行,所以可以输入多行。echo命令会将换行符原样输出,显示的时候正常解释为换行。
 
双引号的另一个常见的使用场合是,文件名包含空格。这时就必须使用双引号(或单引号),将文件名放在里面。
上面命令中,two words.txt是一个包含空格的文件名,如果不放在双引号里面,就会被 Bash 当作两个文件。
 
双引号会原样保存多余的空格。
 
双引号还有一个作用,就是保存原始命令的输出格式。
 

Here 文档

Here 文档(here document)是一种输入多行字符串的方法:
它的格式分成开始标记(<< token)和结束标记(token)。开始标记是两个小于号 + Here 文档的名称,名称可以随意取,后面必须是一个换行符;结束标记是单独一行顶格写的 Here 文档名称,如果不是顶格,结束标记不起作用。两者之间就是多行字符串的内容。
 
通过 Here 文档输出 HTML 代码:
 
Here 文档内部会发生变量替换,同时支持反斜杠转义,但是不支持通配符扩展,双引号和单引号也失去语法作用,变成了普通字符。
 
如果不希望发生变量替换,可以把 Here 文档的开始标记放在单引号之中。
 
 
Here 文档的本质是重定向,它将字符串重定向输出给某个命令,相当于包含了echo命令。
上面代码中,Here 文档相当于echo命令的重定向。
所以,Here 字符串只适合那些可以接受标准输入作为参数的命令,对于其他命令无效,比如echo命令就不能用 Here 文档作为参数。
上面例子不会有任何输出,因为 Here 文档对于echo命令无效。此外,Here 文档也不能作为变量的值,只能用于命令的参数。
 

Here 字符串

Here 文档还有一个变体,叫做 Here 字符串(Here string),使用三个小于号(<<<)表示。
它的作用是将字符串通过标准输入,传递给命令。
有些命令直接接受给定的参数,与通过标准输入接受参数,结果是不一样的。所以才有了这个语法,使得将字符串通过标准输入传递给命令更方便,比如cat命令只接受标准输入传入的字符串。
上面的第一种语法使用了 Here 字符串,要比第二种语法看上去语义更好,也更简洁。
md5sum命令只能接受标准输入作为参数,不能直接将字符串放在命令后面,会被当作文件名,即md5sum ddd里面的ddd会被解释成文件名。这时就可以用 Here 字符串,将字符串传给md5sum命令。
 
 
 
 
 
 

字符串操作

字符串的长度 

获取字符串长度:
 
大括号{}是必需的,否则Bash会将$#理解成脚本的参数个数,将变量名理解成文本。
 

子字符串

字符串提取子串:
 
 
这种语法不能直接操作字符串,只能通过变量来读取字符串,并且不会改变原始字符串。
 
如果省略length,则从位置offset开始,一直返回到字符串的结尾。
 
如果offset为负值,表示从字符串的末尾开始算起。注意,负数前面必须有一个空格, 以防止与${variable:-word}的变量的设置默认值语法混淆。这时还可以指定lengthlength可以是正值,也可以是负值(负值不能超过offset的长度)。
 
 

搜索和替换

  • 字符串头部的模式匹配
    • 以下两种语法可以检查字符串开头,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,返回剩下的部分。原始变量不会发生变化。
       
      匹配模式pattern可以使用*?[]等通配符:
       
      下面写法可以删除文件路径的目录部分,只留下文件名:
       
      如果匹配不成功,则返回原始字符串:
       
      如果要将头部匹配的部分,替换成其他内容,采用下面的写法:
  • 字符串尾部的模式匹配
    • 以下两种语法可以检查字符串结尾,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,返回剩下的部分。原始变量不会发生变化。
       
       
      下面写法可以删除路径的文件名部分,只留下目录部分:
       
      下面的写法可以替换文件的后缀名:
       
      如果匹配不成功,则返回原始字符串。
      如果要将尾部匹配的部分,替换成其他内容,采用下面的写法。
  • 任意位置的模式匹配
    •  
       
      下面的例子将分隔符从:换成换行符。
      上面例子中,echo命令的-e参数,表示将替换后的字符串的\n字符,解释为换行符。
       
      模式部分可以使用通配符:
       
      如果省略了string部分,那么就相当于匹配的部分替换成空字符串,即删除匹配的部分。
       
      这个语法还有两种扩展形式。
 
 

改变大小写

改变变量的大小写:
 
 
  • 计算机基础
  • Linux
  • Shell脚本
  • Bash 变量运算
    目录