Shell脚本入门 03:字符串与数组

Posted Naisu Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本入门 03:字符串与数组相关的知识,希望对你有一定的参考价值。

目的

字符串与数组是Shell编程中常用的数据类型,这篇文章将对相关内容进行介绍。

字符串

Shell中的变量基本上默认都是字符串,通常使用下面方式声明和定义字符串类型的变量:

variable=value # value中不能出现空格
variable='value' # ''内部所有内容都变为单纯的字符串,即使遇到$和``也不进行替换
variable="value: \\"233\\"" # ""内部遇到$和``以及转义符会进行替换
# variable是变量名,value是赋给变量的值
# 赋值=周围不能有空格(重点)
# 所有变量的值都是字符串,比如var=123,123也会以字符串形式存储,即'123'或是"123"
# 变量定义后可以使用=重新赋值

下面是一些常用的字符串操作,需要注意的是对于复杂的字符串操作往往更多的时候会使用 cut grep awk sed expr 等命令。

获取字符串长度

在Shell中可以使用 $#string_name 来获取字符串长度:

拼接字符串

在Shell中拼接字符串不需要任何运算符,只需要把字符串变量排列在一起就行:

截取字符串

在Shell中截取字符串主要有下面方法:

$string:start # 从左边start位置开始,从左到右截取剩余所有的字符串
$string:start:length # 从左边start位置开始,从左到右截取length长度的字符串
$string:0-start # 从右边start位置开始,从左到右截取剩余所有的字符串
$string:0-start:length # 从右边start位置开始,从左到右截取length长度的字符串
$string#chars # 从左开始匹配第一个chars字符串,截取其右边的字符串
$string##chars # 从左开始匹配最后一个chars字符串,截取其右边的字符串
$string%chars # 从右开始匹配第一个chars字符串,截取其左边的字符串
$string%%chars # 从右开始匹配最后一个chars字符串,截取其左边的字符串

替换字符串

在Shell中替换字符串主要有下面方法:

$string/substring/replacement # 使用$replacement, 来代替第一个匹配的$substring
$string//substring/replacement # 使用$replacement, 代替所有匹配的$substring
$string/#substring/replacement # 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
$string/%substring/replacement # 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

判断与默认值

$str:-DEFAULT # 如果str为空, 那么就以DEFAULT作为返回值
$str:=DEFAULT # 如果str为空, 那么就以DEFAULT作为返回值, 并将str赋值为DEFAULT
$str:+OTHER # 如果str不为空, 那么就以OTHER作为返回值
$str:?ERR_MSG # 如果str为空, 那么输出报错信息ERR_MSG并推出程序

内嵌文档与内嵌字符串

内嵌文档 Here Document

Linux中很多命令都是对文件中文本的操作,但有些小的内容放到一个个文件中再由这些命令来操作有时候并不合适,毕竟文件操作速度比较慢。这种情况中有一部分可以用 Here Document 来处理,其使用方式如下:

command <<EOF
    document
EOF

command 是 Shell 命令, <<EOF 是开始标志, EOF 是结束标志, document 是输入的文档,就是一行或多行的字符串。开始标志和结束标志中字符串部分可以自行定义,只要前后一致就行;开始标志的 << 和字符串中间可以有空格;结束标志必须单独一行顶格写,不然会被识别为普通文本。

默认情况下 Here Document 中特定内容会被替换或转义,可以使用单双引号包围开始标志的字段来忽略:

默认情况下 Here Document 会保留文本行首的制表符(主要就是Tab的缩进),可以在 << 符号后加 - 来忽略行首的制表符:

Here Document 通常也被用来作为 多行字符串 使用:

内嵌字符串 Here String

Here String 是 Here Document 的一个变种,它的用法如下:

command <<< string

command 是 Shell 命令, string 是字符串,其使用方法和Shell中的一般字符串的使用方式一样:

字符串在被引号包围的时候也可以作为 多行字符串 使用:

数组

Shell中只有一维数组。

数组定义与使用

Shell中使用下面方式定义数组:

array_name=(ele1  ele2  ele3 ... elen)

数组定义后可以使用索引(下标来取用数组中的元素):

Shell的数组可以在定义时只给出特定几个元素;数组中的元素可以类型不同;可以在使用时再增加长度:

索引可以使用 *@ 来获取数组中所有元素:

获取数组长度

可以用 # 结合 *@ 来获取数组的长度:

需要注意的是这里这计算出的长度只包含非空元素的数量。

拼接数组

Shell中拼接数组主要方法就是将原有数组中内容全部取出,然后生成新数组:

需要注意的是空元素并不会出现在新数组中。

删除数组或其中元素

可以使用 unset 关键词删除数组或其中元素:

需要注意的是删除数组其中元素后其它元素原本的索引号不会改变。

关联数组

通常数组都是靠数字索引需要来使用的,在Shell还有一个叫关联数组的东西,内部存储的是一个个键值对(key-value),其内部的元素可以通过字符串(key)索引来取用。可以使用下面方式声明和定义关联数组:

declare -A array1
array1[key1]=value1
array1[key2]=value2

declare -A array2=([key1]=value1 [key2]=value2)

关联数组元素取用和普通数组相似,只是数字索引变成了键名:

可以用 ! 结合 *@ 来获取关联数组中所有键名:

总结

基本上到这里为止就包含了Shell中变量大部分的基本内容了,在网上就是变量的数值和逻辑运算了,这个将在后面的文章中进行介绍。

以上是关于Shell脚本入门 03:字符串与数组的主要内容,如果未能解决你的问题,请参考以下文章

18 shell脚本--009数组与字符串

Shell编程入门

Linux Shell脚本入门--cut命令

shell入门笔记2:字符串数组echo与printf

shell脚本从入门到复杂四(数组)

Shell脚本开发——变量字符串与数组