第四章 数组、关联数组和别名使用
数组
名词解释
数组作为一种特殊的数据结构在任何一种编程语言中都有它的一席之地,数组在shell脚本中也是非常重要的组成部分,它借助索引将多个独立的数据存储为一个角色。
语法
普通数组只能使用整数作为数组的索引值。
定义数组
格式: arrary[key]=value array=(value value value ...)
数组方法
单行一列值:
array_n=(1 2 3 4) 打印数组第一个值: echo ${array_n[0]} # 0 代表数组里边的索引,从左往右从0开始; echo ${array_n} # 默认不加索引,只打印第一个值。 打印数组所有值: echo ${array_n[*]}
一组索引值:
[root@ceshi ~]# array_num[0]="text1" [root@ceshi ~]# array_num[1]="text2" [root@ceshi ~]# array_num[2]="text3" [root@ceshi ~]# array_num[3]="text4" [root@ceshi ~]# echo ${array_num[0]} # 打印数组中第一个值 text1 [root@ceshi ~]# index=2 [root@ceshi ~]# echo ${array_num[$index]} #也可以通过变量调用索引 text3 [root@ceshi ~]# echo ${array_num[*]} # 打印数组中的所有值 text1 text2 text3 text4
打印数组长度(即数组中 元素的个数)
[root@ceshi ~]# echo ${#array_n[*]} # 也就是打印所有元素的基础上加# 4
删除数组
删除数组中一个值 [root@ceshi ~]# echo ${array_num[*]} text1 text2 text3 text4 [root@ceshi ~]# unset array_num[1] #删除数组中一个值 [root@ceshi ~]# echo ${array_num[*]} text1 text3 text4 [root@ceshi ~]# echo ${array_num[0]} text1 [root@ceshi ~]# echo ${array_num[1]} #元素删除了,索引也跟着删除了。 [root@ceshi ~]# echo ${array_num[2]} text3 删除整个数组 [root@ceshi ~]# unset array_num
数组的切片
就是截取一段数据
array=( [0]=one [1]=two [2]=three [3]=four ) # 截取所有元素 [root@ceshi ~]# echo ${array[@]:0} #等同于echo ${array[*]} ;@也代表所有 one two three four #截取除了第一个元素 之后的所有数据 [root@ceshi ~]# echo ${array[*]:1} two three four #截取前两个元素 [root@ceshi ~]# echo ${array[*]:0:2} one two #截取第2个和第3个元素 [root@ceshi ~]# echo ${array[*]:1:2} two three
子串删除
(实际就是对数组的元素匹配,匹配到的删除,并打印剩余的元素到终端;但并没有真正修改数组)
[root@ceshi ~]# echo ${array[@]:0} #查看数组所有元素 one two three four #从左开始最短的匹配:"t*e" ,这代表会匹配到“thre”,程序就结束 [root@ceshi ~]# echo ${array[@]#t*e} one two e four #从左开始最长的匹配:"t*e" ,这代表会匹配到“three”,程序就结束 [root@ceshi ~]# echo ${array[@]##t*e} one two four #从字符串的结尾开始最短的匹配 [root@ceshi ~]# array[1]=ttwo #先修改two 为ttwo [root@ceshi ~]# echo ${array[@]} #打印数组所有的元素 one ttwo three four [root@ceshi ~]# echo ${array[@]%t*o} #从右开始向左最短匹配 one t three four [root@ceshi ~]# echo ${array[@]%%t*o} #从右开始向左最长匹配 one three four
子串替换
#修改字符串o变成m [root@ceshi ~]# echo ${array[@]/o/m} mne ttwm three fmur #不指定替换子串,则删除匹配到的字符 [root@ceshi ~]# echo ${array[@]/o/} ne ttw three fur [root@ceshi ~]# echo ${array[@]//o/} ne ttw three fur #替换字符串前面的子串 [root@ceshi ~]# echo ${array[@]/#o/A} Ane ttwo three four #替换字符串后面的子串 [root@ceshi ~]# echo ${array[@]/%o/A} one ttwA three four #当然也可以指定数组元素 进行替换 [root@ceshi ~]# echo ${array[3]/o/A} fAur
关联数组
关联数组从bash4.0开始被引入,关联数组的索引值可以使用任意的文本(其实就是把索引替换成了任意的字符串)。关联数组在很多操作中很有用。
array_var=([one]=one-1 [two]=two-2 [three]=three-3) #这里把索引 0 1 2 分别替换成了one two three #当然也可以写成如下 array_var[one]=one-1
[root@ceshi ~]# echo ${array_var[one]} one-1
列出数组索引值
[root@ceshi ~]# echo ${!array_var[*]} one two three 注意:该方法也可以用于普通数组。
别名
别名就是提供一种便捷的方式来完成某些长串命令的操作。省去不必要的麻烦,提高效率。一般可以是函数或者alias命令来实现。
alias举例
alias Nginxrestart='/usr/local/Nginx/sbin/Nginx -s reload' 这样就Nginxrestart就代替了Nginx重启的命令,重启之后才能生效。 注意:马上要使用,需要把这条命令放入~/.bashrc文件中,退出系统 重新登录一下就可以使用了。 echo 'alias Nginxrestart="/usr/local/Nginx/sbin/Nginx -s reload"' >> ~/.bashrc
查看系统已经定义的别名
[root@ceshi ~]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
别名转义
有些命令不是总是希望使用别名,可以在命令之前输入反斜杠\来忽略所定义过的别名。
格式:[root@ceshi ~]# \command
[root@ceshi ~]# alias #查看已经定义的别名 alias pwd='pwd | cat -n' [root@ceshi ~]# pwd #查看别名后的命令的结果 1 /root [root@ceshi ~]# \pwd #忽略别名后 pwd的结果,忽略了打印行号的功能。 /root