目录
Shell字符串
代码1
test3_1.sh
运行
结果
获取字符串长度
代码2
test3_2.sh
运行
结果
Shell字符串拼接
代码3
test3_3.sh
运行
结果
Shell字符串截取
从指定位置开始截取
从字符串左边开始计数
从字符串右边开始计数
从指定字符开始截取
使用#号截取右边字符
使用%号截取左边字符
代码4
test3_4.sh
运行
结果
Shell数组的定义
获取数组元素
代码5
test3_5.sh
运行
结果
Shell获取数组长度
代码6
test3_6.sh
运行
结果
Shell数组拼接、合并
代码7
test3_7.sh
运行
结果
Shell删除数组元素
代码8
test3_8.sh
运行
结果
Shell关联数组
代码9
test3_9.sh
运行
结果
Shell字符串
字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。
str1=aaaaa
str2='bbbbb'
str3="ccccc"
三种形式的区别:
不被引号包围的字符串:不被引号包围的字符串中出现变量时也会被解析;字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
由单引号包围的字符串:任何字符都会原样输出,在其中使用变量是无效的;字符串中不能出现单引号,对单引号进行转义也不行。
由双引号" "包围的字符串: 如果其中包含了某个变量,那么该变量会被解析,得到该变量的值,而不是原样输出;字符串中可以出现双引号。
代码1
test3_1.sh
#!/bin/bash
num=20
str1=aaa$numaa
str2='bbb$num bb'
str3="ccc$num \"cc\""
echo $str1
echo $str2
echo -e $str3
给予可执行权限。
chmod 777 test3_1.sh
运行
./test3_1.sh
结果
获取字符串长度
${#字符串名}
${#string_name}
代码2
test3_2.sh
#!/bin/bash
str="abcdefg :/"
echo ${#str}
给予可执行权限。
chmod 777 test3_2.sh
运行
./test3_2.sh
结果
Shell字符串拼接
将两个字符串并排放在一起就能实现拼接。
代码3
test3_3.sh
#!/bin/bash
Str1="你好,"
Str2="世界!"
str1=$Str1$Str2 #中间不能有空格
str2="$Str1 $Str2" #如果被双引号包围,那么中间可以有空格
str3=$Str1": "$Str2 #中间可以出现别的字符串
str4="$Str1: $Str2" #这样写也可以
str5="${Str1}aaa ${Str2}bbb" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
给予可执行权限。
chmod 777 test3_3.sh
运行
./test3_3.sh
结果
Shell字符串截取
Shell截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。
从指定位置开始截取
这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。
既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是Shell同时支持两种计数方式。
从左边开始计数时,起始数字是0(这符合程序员思维);从右边开始计数时,起始数字是1(这符合常人思维)。计数方向不同,起始数字也不同。
不管从哪边开始计数,截取方向都是从左到右。
从字符串左边开始计数
${字符串: 起始位置: 截取长度}
${string: start: length}
string是要截取的字符串,start是起始位置(从左边开始,从0开始计数),length是要截取的长度(省略的话表示直到字符串的末尾)。
从字符串右边开始计数
${字符串: 0-从右边数截取的起始位置: 截取长度}
${string: 0-start: length}
从指定字符开始截取
这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。
使用#号截取右边字符
使用#号可以截取指定字符(或者子字符串)右边的所有字符。
${字符串#*子字符串}
${string#*chars}
string表示要截取的字符,chars是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见chars(chars不会被截取)。
使用%号截取左边字符
使用%号可以截取指定字符(或者子字符串)左边的所有字符。
${字符串%子字符串*}
${string%chars*}
注意*的位置,因为要截取chars左边的字符,而忽略chars右边的字符,所以*应该位于chars的右侧。
代码4
test3_4.sh
#!/bin/bash
str1="aaabbbccc aaabbbccc"
echo -e "str1=${str1}\n"
echo "-----------------左边开始计数截取字符串-----------------"
echo ${str1: 2: 9}
echo -e "--------------------------------------------------------\n"
echo "-----------左边开始计数截取字符串,省略length-----------"
echo ${str1: 2}
echo -e "--------------------------------------------------------\n"
echo "-----------------右边开始计数截取字符串-----------------"
echo ${str1: 0-13: 9}
echo -e "--------------------------------------------------------\n"
echo "-----------右边开始计数截取字符串,省略length-----------"
echo ${str1: 0-13}
echo -e "--------------------------------------------------------\n"
echo "------------------使用#号截取右边字符-------------------"
echo "使用#*,匹配到第一个就结束:${str1#*bb}"
echo "使用##*,匹配到最后一个结束:${str1##*bb}"
echo -e "--------------------------------------------------------\n"
echo "------------------使用%号截取左边字符-------------------"
echo "使用%*,匹配到最后一个结束:${str1%bb*}"
echo "使用%%*,匹配到第一个就结束:${str1%%bb*}"
echo -e "--------------------------------------------------------\n"
给予可执行权限。
chmod 777 test3_4.sh
运行
./test3_4.sh
结果
Shell数组的定义
数组名=(元素1 元素2 元素3 ... 元素n)
array_name=(ele1 ele2 ele3 ... elen)
常用的Bash Shell只支持一维数组,不支持多维数组。Shell数组元素的下标也是从0开始计数。
在Shell中,用括号( )来表示数组,数组元素之间用空格来分隔。
Shell是弱类型的,它并不要求所有数组元素的类型必须相同。
Shell数组的长度不是固定的,定义之后还可以增加元素。
无需逐个元素地给数组赋值。
注意:赋值号=两边不能有空格,必须紧挨着数组名和数组元素。
获取数组元素
获取数组元素的值。
${数组名[下标]}
${array_name[index]}
array_name是数组名,index是下标。
使用@或*可以获取数组中的所有元素。
代码5
test3_5.sh
#!/bin/bash
ShuZu1=(29 100 13 "你好,世界!" 91 44)
echo "ShuZu1:${ShuZu1[@]}" #输出所有数组元素
ShuZu1[10]=66 #给第10个元素赋值(此时会增加数组长度)
echo "增加元素,ShuZu1:${ShuZu1[*]}" #输出所有数组元素
echo "第3个元素:${ShuZu1[3]}" #输出第3个元素
给予可执行权限。
chmod 777 test3_5.sh
运行
./test3_5.sh
结果
Shell获取数组长度
利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数。
${#数组名[@]}
${#数组名[*]}
${#array_name[@]}
${#array_name[*]}
代码6
test3_6.sh
#!/bin/bash
ShuZu=(29 100 13)
echo ${#ShuZu[*]}
#向数组中添加元素
ShuZu[10]="你好,世界!"
echo ${#ShuZu[@]}
echo ${#ShuZu[10]}
#删除数组元素
unset ShuZu[1]
echo ${#ShuZu[*]}
给予可执行权限。
chmod 777 test3_6.sh
运行
./test3_6.sh
结果
Shell数组拼接、合并
Shell数组拼接(数组合并),将两个数组连接成一个数组。拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。
数组=(${数组1[@]} ${数组2[@]})
数组=(${数组1[*]} ${数组2[*]})
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
array1和array2是需要拼接的数组,array_new是拼接后形成的新数组。
代码7
test3_7.sh
#!/bin/bash
ShuZu1=(23 56)
ShuZu2=(99 "你好,世界!")
ShuZu=(${ShuZu1[@]} ${ShuZu2[*]})
echo ${ShuZu[@]}
给予可执行权限。
chmod 777 test3_7.sh
运行
./test3_7.sh
结果
Shell删除数组元素
在Shell中,使用unset关键字来删除数组元素。
unset 数组名[下标]
unset array_name[index]
array_name表示数组名,index表示数组下标。
删除整个数组,所有元素都会消失。
unset 数组名
unset array_name
代码8
test3_8.sh
#!/bin/bash
ShuZu=(23 56 99 "你好,世界!")
echo ${ShuZu[@]}
unset ShuZu[1]
echo ${ShuZu[@]}
unset ShuZu
echo ${ShuZu[*]}
给予可执行权限。
chmod 777 test3_8.sh
运行
./test3_8.sh
结果
Shell关联数组
关联数组使用字符串作为下标,而不是整数。关联数组也称"键值对(key-value)"数组,key为下标,value为元素值。
declare -A 数组名 #声明关联数组
数组名[索引]=值 #一次赋一个值
数组名=([索引1]=值1 [索引2]=值2 [索引3]=值3) #一次赋多个值
代码9
test3_9.sh
#!/bin/bash
declare -A GuanLian_ShuZu #声明关联数组
GuanLian_ShuZu=([name]="张三" [sex]="男" [age]=17)
GuanLian_ShuZu[addr]="中国"
GuanLian_ShuZu[email]="xxx@mail.com"
echo "name对应的值为:${GuanLian_ShuZu[name]}"
echo "email对应的值为:${GuanLian_ShuZu[email]}"
echo "该关联数组一共有:${#GuanLian_ShuZu[@]}个元素"
echo "数组全部元素为:${GuanLian_ShuZu[*]}"
echo "数组的所有下标为:${!GuanLian_ShuZu[*]}"
给予可执行权限。
chmod 777 test3_9.sh
运行
./test3_9.sh
结果