字符串与数组是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并推出程序
Linux中很多命令都是对文件中文本的操作,但有些小的内容放到一个个文件中再由这些命令来操作有时候并不合适,毕竟文件操作速度比较慢。这种情况中有一部分可以用 Here Document 来处理,其使用方式如下:
command <<EOF
document
EOF
command
是 Shell 命令, <
EOF
是结束标志, document
是输入的文档,就是一行或多行的字符串。开始标志和结束标志中字符串部分可以自行定义,只要前后一致就行;开始标志的 <<
和字符串中间可以有空格;结束标志必须单独一行顶格写,不然会被识别为普通文本。
默认情况下 Here Document 中特定内容会被替换或转义,可以使用单双引号包围开始标志的字段来忽略:
默认情况下 Here Document 会保留文本行首的制表符(主要就是Tab的缩进),可以在 <<
符号后加 -
来忽略行首的制表符:
Here Document 通常也被用来作为 多行字符串 使用:
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中变量大部分的基本内容了,在网上就是变量的数值和逻辑运算了,这个将在后面的文章中进行介绍。