数组
主要内容:
一:数组的生明。
二:数组的赋值
(1)一次只赋值一个元素
(2)一次赋值全部元素
(3)只赋值特定元素
(4)交互式对数组赋值
(5)显示所有的数组
(6)以命令的执行结果赋值给数组
(7)在已经定义好的数组中增加值
(8)删除数组中的某个值
(9)删除整个数组
(10)关联数组
(11)数组的切片
三:字符串处理
(1)字符串切片
(2)字符串处理
基于模式取子串
查找替换
查找并删除
字符大小写转换
高级变量的用法
eval命令
mktemp命令
install命令
expect命令
一:数组的分类:索引数组:下标编号从零开始,且为连续的数,属于数值索引。
关联索引:即自定义格式 下标不一定连续,也不一定是数字。
数组的生明:
declare -x varname :设置环境变量
declare -i :生明整数
declare -g : 设置函数为全局函数
declare -xf : 设置环境函数
declare -a 数组名 : 生明索引数组
declare -A 数组名 :生明关联数组
二:数组的赋值:
(1)一次只赋值一个元素
例如:[root@centosliuhua lianxi321]# test=123
[root@centosliuhua lianxi321]# echo $test
123
(2)一次赋值全部元素
例如[root@centosliuhua lianxi321]# test=(test1 test2 test3 test4 test5 )
[root@centosliuhua lianxi321]# declare -a |grep test
declare -a test='([0]="test1" [1]="test2" [2]="test3" [3]="test4" [4]="test5")'
当赋值多个元素时:echo $test 引用第一个值:echo ${test[3] }指定下标以引用指定的值 echo ${tast[*|@]} :显示所有的数组值。 echo ${#test[*]} :显示数组参数的总数量有多少个。 echo ${test[$[${#test[*]}-1]]}:引用参数的最后一个值。
(3)只赋值特定元素
例如:[root@centos7 ~]# course=([0]=linux [2]=python [5]=oracle)
(4)交互式对数组赋值:read -a ARRAY
例如:[root@centosliuhua lianxi321]# read -a test
liubei guanyu zhangfei xiaoqian
[root@centosliuhua lianxi321]# declare -a |grep test
declare -a test='([0]="liubei" [1]="guanyu" [2]="zhangfei" [3]="xiaoqian")
(5)显示所有的数组:declare -a
(6)以命令的执行结果赋值给数组
例如:-#]test=({1..10})
将某个目录下的文件赋值给数组:-#]test=(/var/log/*.conf) 就是将所有以".conf"结尾的文件赋值给数组test
练习:练习:分别显示每一个值,每个值换一行。
如
[root@centos7 ~]# echo ${test[@]}
hello hi good morning
test[0] is hello
test[1] is hi
test[2] is good
test[3] is morning
答案
[root@centos7 ~]# for n in $(seq 0 $[${#testshuzu[*]}-1]);do
> echo testshuzu[$n] is ${testshuzu[$n]}
> done
testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun
(7)在已经定义好的数组中增加值:
如果增加时不指定索引数新增加的数值将会直接覆盖索引数为零的那个数值,如果指定数值为已存在的则会替换此数值,如果不存在则添加完成。
例如:
root@centos7 ~]# testshuzu[${#testshuzu[*]}]=machao
[root@centos7 ~]# for n in $(seq 0 $[${#testshuzu[*]}-1]);do echo testshuzu[$n] is ${testshuzu[$n]}; done
testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun
testshuzu[5] is machao
(8)删除数组中的某个值
unset testshuzu[1]
(9)删除整个数组
unset testshuzu
(10)关联数组
两种方式:
一:先声明,再赋值
declare -A testshuzu
testshuzu=([zhugong]=liubei [erdi]=guanyu [sandi]=zhangfei)
二:声明,赋值一步到位
declare -A weiguo=([chengxiang]=caocao [junshi]=simayi [jiangju]=xiahoudun )
(11)数组的切片
offset: 要跳过的元素个数
number: 要取出的元素个数
取偏移量之后的所有元素
例如:[root@centosliuhua lianxi321]# declare -a |grep test
declare -a test='([0]="machao" [1]="guanyu" [2]="zhangfei" [3]="xiaoqian")'
[root@centosliuhua lianxi321]# echo ${test[*]:1:2}
guanyu zhangfei
[root@centosliuhua lianxi321]# echo ${test[*]:1:3}
guanyu zhangfei xiaoqian
[root@centosliuhua lianxi321]# echo ${test[*]:1}
guanyu zhangfei xiaoqian
[root@centosliuhua lianxi321]# echo ${test[*] :1}
guanyu zhangfei xiaoqian
[root@centosliuhua lianxi321]# echo ${test[*]: :1}
machao
[root@centosliuhua lianxi321]# echo ${test[*]: :2}
machao guanyu
[root@centosliuhua lianxi321]# echo ${test[*]: :3}
machao guanyu zhangfei
三:
(1)字符串切片
(1.1)${#var}:返回字符串变量var的长度
[root@centosliuhua lianxi321]# unset test
[root@centosliuhua lianxi321]# test=(hello nili m三国)
[root@centosliuhua lianxi321]# echo ${#test[3]}
显示第三个数值的字符串长度
[root@centosliuhua lianxi321]# echo ${#test[*]}
显示数组的总长度
(1.2)${var:off}:返回字符串变量var中从第off个字符后(不包括off)的字符开始,到最后的部分,offset的取值在0到${$var}-1之间
例如:[root@centosliuhua lianxi321]# echo ${test:2}
${var:off:number}:返回字符串变量var中从off个字符后开始长度为number的部分。
例如: [root@centosliuhua lianxi321]# unset test
[root@centosliuhua lianxi321]# test=mage教育du
[root@centosliuhua lianxi321]# echo ${test:1:2}
从左边跳过第一个字符取第二第三个字符
${var: -length}:去自符串的最右侧几个字符
[root@centosliuhua lianxi321]# echo ${test: -3}
注意-3前加空格
${var:off:-length}:从最左侧跳过offset字符,一直取到距离最右侧length个字符之前的内容
例如:[root@centosliuhua lianxi321]# echo ${test:3:-1}
[root@centosliuhua lianxi321]# echo ${test: -2:1}
从右往左数两个字符然后取第二个
[root@centosliuhua lianxi321]# echo ${test: -3:3}
从右往左数三个字符然后取这三个字符
${var: -length:-offset}:先从右侧向左侧取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容。
例如;[root@centosliuhua lianxi321]# echo ${test: -2: -5}
注意:-length前有空格。
(2)字符串处理
(2.1)基于模式取子串
${var#*word}:word表示指定的任意字符;从左往右查找所有存储的字符串中第一次出现的word,并删除字符串开头至word第一次出现之间的所有字符
(2.2)${var:##*word}:贪婪模式 ;功能同上,不同点在于它是删除从字符串开头至最后一次由word指定的字符之间的所有字符。
(2.1)例如: [root@centosliuhua ~]# test=akdfggxoodwwnmm
[root@centosliuhua ~]# echo ${test#*gg}
xoodwwnmm
(2.2)例如:[root@centosliuhua ~]# echo ${test##*w}
nmm
${var%word*}:从右往左查找var中第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
${var%%word*}:同上:不同之处是删除从右想左至最后一次出现word之间所有字符串。
(2.3)查找替换
例如:[root@centosliuhua ~]# echo ${test/d/oo*}
akoofggxoodwwnmm
表示查找test中第一次被d所匹配到的字符并替换为oo
例如:[root@centosliuhua ~]# echo ${test//d/ee}
akeefggxooeewwnmm
表示查找test中所有能被d匹配到的字符并替换为ee
例如:[root@centosliuhua ~]# echo ${test/#a/ee}
eekdfggxoodwwnmm
表示查找test中行首被a匹配到的字符串并替换为ee
例如:[root@centosliuhua ~]# echo ${test/%m/ee}
akdfggxoodwwnmee
表示行尾被m匹配到的字符并替换为ee
(2.4)查找并删除
${var/pattern}:删除var所表示的字符串中第一个被pattern所匹配到的字符串。
${var//pattrern}:删除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:删除var所表示的字符串中所有以pattern为行首的字符串
${var/%pattern}:删除var所表示的字符串中所有以pattern结尾的字符串
(2.5)字符大小写转换
${var^^}:把var中的所有小写字母转换为大写字母。
${var,,}:把var中所有大写字母转换为小写字母。
(2.6)高级变量的用法
Shell变量一般是无类型的,但是bash Shell提供了declare和
typeset两个命令用于指定变量的类型,两个命令是等价的
declare [选项] 变量名
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示已定义的所有函数名及其内容
-F 仅显示已定义的所有函数名
-x 声明或显示环境变量和函数
-l 声明变量为小写字母 declare –l var=UPPER
-u 声明变量为大写字母 declare –u var=lower
(2.7)eval命令
eval命令将会首先扫描命令进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量,该命令对便量进行两次扫描。
例如: [root@centosliuhua ~]# cm=whoami
[root@centosliuhua ~]# echo $cm
whoami
[root@centosliuhua ~]# eval $cm
root
[root@centosliuhua ~]# n=10
[root@centosliuhua ~]# echo {1..$n}
{1..10}
[root@centosliuhua ~]# eval echo {1..$n}
1 2 3 4 5 6 7 8 9 10
[root@centos7 ~]# mage=linux
[root@centos7 ~]# linux=centos
root@centos7 ~]# eval echo \$$mage
centos
[root@centos7 ~]# centos=redhat
[root@centos7 ~]# eval echo \$$(eval echo \$$mage)
redhat
(2.8)mktemp命令:创建并显示临时文件,可避免冲突
mktemp [OPTION]... [TEMPLATE]
TEMPLATE: filename.XXX
X至少要出现三个
OPTION:
-d: 创建临时目录
-p DIR或--tmpdir=DIR:指明临时文件所存放目录位置
示例:
mktemp /tmp/test.XXX
tmpdir=`mktemp –d /tmp/testdir.XXX`
mktemp --tmpdir=/testdir test.XXXXXX
install命令:
install [OPTION]... [-T] SOURCE DEST 单文件
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...创建空目录
选项:
-m MODE,默认755
-o OWNER
-g GROUP
示例:
install -m 700 -o wang -g admins srcfile desfile
install –m –d /testdir/installdir
install -m 700 -o liubei -g root /etc/passwd /app/hellopasswd
(2.9) expect命令
#!/usr/bin/expect
#time:2018/3/24
#作用:交互式登陆时自动输入密码
set ip [lindex $argv 0]
spawn ssh $ip
expect {
"yes/no" {send "yes\n";exp_continue }
"password" { send "centos\n" }
}
interact(此命令可以留在登陆端)
#expect eof(此命令是登陆后退出)