字符串

字符串引用

Shell中引用字符串可以使用双引号,也可以使用单引号,也可以不使用引号。

双引号

最常使用的引用形式就是加双引号

1
2
str="test"
echo "quote \"$str\""

使用双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

单引号

1
str='this is a string'

使用单引号有所限制:

  • 在echo命令下,单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

无引号

1
2
str=this is a string
str=this

不使用引号只适合引用单个单词变量时使用,空格之后的字符无法识别。

字符串操作

拼接字符串

1
2
3
4
5
6
7
8
9
your_name="Jerry"
# 使用双引号拼接
greeting1="hello, "$your_name" !\r"
greeting2="hello, ${your_name} !"
echo -e $greeting1$greeting2
# 使用单引号拼接
greeting3='hello, '$your_name' !\r'
greeting4='hello, ${your_name} !'
echo -e $greeting3$greeting4

输出结果:

1
2
3
4
hello, Jerry !
hello, Jerry !
hello, Jerry !
hello, ${your_name} !

证明单引号中直接引用变量是无效的。

获取字符串长度

1
2
3
4
string="abcdefg"
echo ${#string}

#输出为7

提取子字符串

1
2
3
string="I am learning Shell!"
echo ${string:1:5} # 输出 am l
echo ${string:3} # 输出 m learning Shell!

空格不做字符统计,使用${string:1:5}时包头不包尾。

反引号使用

如果需要调用命令的输出,或把命令的输出赋予变量,则命令必须使用反引号包含,这条命令才会执行,反引号的作用和$(命令)是一样的,但是反引号非常容易和单引号搞混,所以推荐大家使用 $(命令) 的方式引用命令的输出。

1
2
3
4
echo `date`

#输出为:Tue Jun 25 01:43:27 UTC 2019
#作用与命令 echo $(date) 相同

查找子字符串

1
2
3
4
5
string="I am learning Shell!"
echo `expr index "$string" Sh`
echo $(expr index "$string" Sh)

#输出为 15

查找字符 S 的位置(哪个字母先出现就计算哪个)

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

定义数组

用括号来表示数组,数组元素用空格分割开,等号左边不能加空格

1
array_name=(value0 value1 value2 value3 ...)

也可以使用空行:

1
2
3
4
5
6
7
array_name=(
value0
value1
value2
value3
...
)

还可以单独定义数组的各个分量:

1
2
3
4
array_name[0]=value0
array_name[1]=value1
...
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

读取数组

1
${array_name[index]}

通过引用数组的方式进行读取

使用 @ 获取 * 符号可以获取数组中的所有元素:

1
2
3
4
5
6
7
8
array=(1 2 3 4)
echo ${array[2]}
echo ${array[@]}
echo ${array[*]}

#输出为
3
1 2 3 4

获取数组长度

获取数组长度的方法与获取字符串长度的方法相同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array=(12 2 3 4)
# 取得数组指定元素的长度
echo ${#array[2]}
# 取得数组元素的个数
echo ${#array[@]}
# 取得数组元素的个数
echo ${#array[*]}
# 取得数组单个元素的长度(取最大)
echo ${#array[n]}

# 输出为

1
4
4
2