数组定义:
能够存储多个元素的内存空间,每个元素在数组中具有特定的索引编号,我们可以通过变量名和索引编号来查看数组中的某一元素。
数组分类:
索引数组:
定义:索引编号从0开始,依次递增加一,如:0、1、2、3…
array[0]、array[1]、array[2]…
声明方式:declare -a arrayname
关联数组:
定义:索引内容可以由我们自行指定,在bash4.0版本以后开始支持。
array[haha]、array[xixi]、array[enen]…
声明方式:declare -A arrayname
注意:索引数组在使时必须事先声明,否则调用时会出错,如下图所示。
root@cenots6.8 ~ # array[a]=1 root@cenots6.8 ~ # array[b]=2 root@cenots6.8 ~ # array[c]=3 root@cenots6.8 ~ # array[d]=4 root@cenots6.8 ~ # echo ${array[@]} 4 root@cenots6.8 ~ # declare -A array root@cenots6.8 ~ # array[a]=1 root@cenots6.8 ~ # array[b]=2 root@cenots6.8 ~ # echo ${array[a]} 1 root@cenots6.8 ~ # echo ${array[b]} 2
root@cenots6.8 ~ # unset array root@cenots6.8 ~ # array[0]=1 root@cenots6.8 ~ # array[1]=2 root@cenots6.8 ~ # array[2]=3 root@cenots6.8 ~ # echo ${array[@]} 1 2 3
数组的赋值方式:
a、每次赋值一个元素:
array_name[index]=vallue
举例:array[0]=1 ## 将1赋值给数组中索引为0的元素,也可以理解为数组中第一个位置处存放的元素为1
b、一次赋值全部元素:
array_name=("value1"空格“value2”空格“value3”…)
举例:array=(haha xixi enen) ##这里需要注意,如果之前array已经赋过值了,那么之数组的值将被覆盖。
c、只赋值特定元素:
array_name=([0]="value1"空格"[2]=value2"空格[3]="value3"…)
举例:array=([0]=1 [3]="xixi" [4]="abc") ###注意:bash的数组支持稀疏格式(索引不连续)
d、交互式赋值:
read -a array_name
root@cenots6.8 ~ # read -a array 1 aa bb 3 4 root@cenots6.8 ~ # echo ${array[@]} 1 aa bb 3 4
e、向稀疏数组中追加元素:
array[${#array_name[@]}]=value
f、删除数组中的某一元素
unset array[index]
数组的引用:
引用数组元素:${array_name[index]} ##这里需要注意如果省略“{}”,则表示引用下表为0的元素。
引用数组中的所有元素:${array_name[@]} 或 ${array_name[*]}
数组的长度:${#array_name[*]} 或 ${#array_name[@]}
数组数据处理:
数组切片:${array_name[*]:offset:number}
offset:跳过多少个 ;number:显示多少个;处理顺序:从做到右
root@cenots6.8 ~ # array=(1 2 3 4 5 6 7 8 9 10) root@cenots6.8 ~ # echo ${array[@]:6:2} 7 8 root@cenots6.8 ~ # echo ${array[@]:6} 7 8 9 10
字符串处理:
字符串切片:
1、${#var}:返回字符串var的长度,此处用法等同于${#array_name[@]}
root@cenots6.8 ~ # var=`getent passwd root` root@cenots6.8 ~ # echo ${#var} 39
2、${var:offset:number}:返回字符串变量var中,从左到右的顺序,先跳过“offset”个字符,然后显示其后面的“number”个字符
root@cenots6.8 ~ # var=`getent passwd root` root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var:3:3} t:x
3、${var:offset}:返回字符串变量var中,从做到右的顺序,跳过“offset”个字符,显示剩余的部分
root@cenots6.8 ~ # echo ${var:3} t:x:0:0:bb,,62985600:/root:/bin/bash
4、${var:空格-number}:从右往左显示“number”个字符(-number选项需要在bash4.2以后的版本才能使用)
root@cenots6.8 ~ # echo ${var: -4} bash
5、${var:offset:空格-number}:从左往右的顺序,先跳过“offset”个字符,然后取到最右侧number个长度字符之前。(-number选项需要在bash4.2以后的版本才能使用)
root@Centos7.2 ~ # var=`getent passwd root` root@Centos7.2 ~ # echo ${var:3: -3} t:x:0:0:root:/root:/bin/b
基于模式取子串:
1、${var#*PARTTERN}:此处PARTTERN可以指定任意字符, 自左向右查找第一次匹配到PARTTERN的内容,然后从行首删到第一次匹配到的所有内容。
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var#*/} root:/bin/bash
2、${var##*PARTTERN}:自左向右查找最后一次匹配到PARTTERN的内容,然后从行首删除之最后一次匹配到的所有内容。
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var##*/} bash
3、${var%PARTTERN*}:自右向左的顺序查找第一次匹配到的内容,然后从右面行首删除至第一次匹配到的所有内容。
var=root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var%/*} root:x:0:0:bb,,62985600:/root:/bin
4、${var%%PARTTERN*}:自右向左的顺序查找最后一次匹配到的内容,然后从右面行首删除至最后一次匹配到的所有内容。
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var%%/*} root:x:0:0:bb,,62985600:
查找替换:
1、${var/PARTTERN/substi}:自左向右,查找var所表示的字符串中,第一次被PARTTERN所匹配到的字符串,用substi替换
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var/root/david/} naruto/:x:0:0:bb,,62985600:/root:/bin/bash
2、${var//PARTTERN/sbusti}:自左向右,查找var所表示的字符串中,所有次被PARTTERN所匹配到的字符串,用substi替换
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var//root/naruto} naruto:x:0:0:bb,,62985600:/naruto:/bin/bash
3、${var/#PARTTERN/sbusti}:查找var所表示的字符串中,行首被PARTTERN所匹配到的字符串,用sunsti替换
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var/#root/naruto} naruto:x:0:0:bb,,62985600:/root:/bin/bash
4、${var/%PARTTERN/sbusti}:查找var所表示的字符串中,行尾被PARTTERN所匹配到的字符串,用sunsti替换
root@cenots6.8 ~ # echo ${var/%bash/naruto} root:x:0:0:bb,,62985600:/root:/bin/naruto
查找删除:
1、${var/PARTTERN}:查找var所表示的字符串中,第一次被PARTTERN所匹配到的内容并删除。
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var/root} :x:0:0:bb,,62985600:/root:/bin/bash
2、${var//PARTTERN}:查找var所表示的字符串中,所有被PARTTERN所匹配到的内容并删除。
root@cenots6.8 ~ # echo ${var//root} :x:0:0:bb,,62985600:/:/bin/bash
3、${var/PARTTERN}:查找var所表示的字符串中,行首被PARTTERN所匹配到的内容并删除。
4、${var/PARTTERN}:查找var所表示的字符串中,行尾被PARTTERN所匹配到的内容并删除。
字符串大小写转换:
1、${var^^}:把var中所有小写字符转换为大写
root@cenots6.8 ~ # echo $var root:x:0:0:bb,,62985600:/root:/bin/bash root@cenots6.8 ~ # echo ${var^^} ROOT:X:0:0:BB,,62985600:/ROOT:/BIN/BASH
2、${var,,}:把var中所有大写字符转换为小写
变量赋值的特殊方式:
1、${var:-value}:如果var值为空,那么反馈value的值,否则,返回var的值
root@cenots6.8 ~ # echo ${var:-abc} abc root@cenots6.8 ~ # var=123 root@cenots6.8 ~ # echo ${var:-abc} 123
2、${var:+value}:如果var值不为空,那么返回value的值,否则返回var的值
root@cenots6.8 ~ # var=123 root@cenots6.8 ~ # echo ${var:+abcd} abcd
3、${var:=value}:如果var值为空,则返回value的值,然后将value的值赋给var,否则返回var的值
root@cenots6.8 ~ # unset var root@cenots6.8 ~ # echo ${var:=naruto} naruto root@cenots6.8 ~ # echo $var naruto
4、${var:?error_info}:如果var值为空,则返回那么在当前终端打印error_info,否则返回var的值
root@cenots6.8 ~ # unset var root@cenots6.8 ~ # echo ${var:?Are you kiding me?} -bash: var: Are you kiding me?
高级变量用法:
shell是一种弱类型语言,因此我们在给变量赋值时,自动默认为字符串类型,当我们需要指定某些某些特殊变量类型时可通过declare命令指定,方法如下:
格式:declare options varname
选项:-r 将变量设置为只读变量
-i 将变量定义为整形
-a 将变量定义为索引数组
-A 将变量定义为关联数组
-x 将变量定义为环境变量 ,等同与export
-I 将变量值转换为小写字母 declare -I var=UUID
-u 将变量值转换为大写字母 declare -u var=uuid
-f 显示此脚本前定义过的所有函数名及其内容
-F 仅显示此脚本前定义过的所有函数名
间接变量引用:
间接变量:变量a中存有元素,然后将变量a当做b的元素存储起来,当我们调用b时,就可以查看a中的内容,此时我们称之为变量的间接引用。
root@cenots6.8 ~ # a=wahaha root@cenots6.8 ~ # b=a root@cenots6.8 ~ # echo ${!b}
eval命令将会首先扫描命令然后进行替换,在执行命令,该命令适用于那些第一次无法实现其功能的变量,该命令对其进行两次扫描。
root@cenots6.8 ~ # cmd=whoami root@cenots6.8 ~ # echo $cmd whoami root@cenots6.8 ~ # eval $cmd root root@cenots6.8 ~ # $cmd root
创建临时文件:
命令:mktemp,创建临时文件,通过尾部#为的随机字符,可以避免冲突
格式:mktemp [option]…fileName.XXX (XXX至少三个,可以更多,多多少?你试试)
root@cenots6.8 ~ # mktemp a.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX a.Cavjq0rtlW7uLTGnzk34auduckfw37HjicbSiwEvP
选项:-d:创建临时目录
-p DIR 或 –tmpdir=DIR:指明临时文件所在目录的位置
root@cenots6.8 ~ # mktemp -d ~/tempdir.XXX /root/tempdir.wUB root@cenots6.8 ~ # mktemp -p ~/tempdir.wUB a.XXXX /root/tempdir.wUB/a.2jDI
安装复制文件:
命令:install
功能:此install 将文件(通常仅是编译后的文件)复制到您所选择的目的位置
格式:
1、install [options]…[-T] source dest 单个文件
举例:如下所示,经install复制过的文件权限发生了变化,由644变成了755自动加了执行权限
root@cenots6.8 ~ # touch aa root@cenots6.8 ~ # install aa bb root@cenots6.8 ~ # ll aa bb -rw-r--r--. 1 root root 0 8月 24 13:47 aa -rwxr-xr-x. 1 root root 0 8月 24 13:47 bb
2、install [option]…source…directory
举例:复制文件到指定目录中,并给文件添加执行权限
root@cenots6.8 ~ # cd /testdir/ root@cenots6.8 /testdir # install ee ~/ root@cenots6.8 /testdir # cd root@cenots6.8 ~ # ll ee -rwxr-xr-x. 1 root root 0 8月 24 16:12 ee
3、install [OPTION]… -t DIRECTORY SOURCE…
举例:复制文件到指定目录中,并添加执行权限
root@cenots6.8 ~ # touch ee root@cenots6.8 ~ # ll ee -rw-r--r--. 1 root root 0 8月 24 16:09 ee root@cenots6.8 ~ # install -t /testdir/ ee root@cenots6.8 ~ # ll /testdir/ee -rwxr-xr-x. 1 root root 0 8月 24 16:10 /testdir/ee
4、install [OPTION]… -d DIRECTORY…
举例:创建空目录,并附加权限
root@cenots6.8 ~ # install -m 777 -d dir root@cenots6.8 ~ # ll dir -d drwxrwxrwx. 2 root root 4096 8月 24 16:04 dir
选项:
-m MODE,默认755
-o OWNER
-g GROUP
root@cenots6.8 ~ # install -m 222 -o xixi -g root aa cc root@cenots6.8 ~ # ll cc --w--w--w-. 1 xixi root 0 8月 24 16:02 cc
bash的配置文件:
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
shell登陆的两种方式:
交互式登陆:
1、直接通过终端输入账号密码登陆;
2、使用“su – username”切换的用户
执行顺序:/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc
交互式登陆:
1、使用su username切换用户
2、图形界面下打开的终端
3、执行脚本
执行顺序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
根据profile和bashrc来分类:
bashrc类:为非交互式和交互式登录的shell提供配置
全局: /etc/bashrc
个人: ~/.bashrc
功用:
1、定义命令别名和函数
2、定义本地变量
profile类:为交互式登录的shell提供配置
全局: /etc/profile, /etc/profile.d/*.sh
个人: ~/.bash_profile
功用:
1、用于定义环境变量
2、运行命令或脚本
修改profile和bashrc文件后需生效
两种方法:
1、重新启动shell进程
2 、source或 "."
bash的退出任务
保存在~/.bash_logout文件中(用户)在退出登录shell时运行
功能:
创建自动备份
清除临时文件
1、编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;要统计其下标为偶数的文件中的行数之和
#!/bin/bash declare -a log declare -i j=0 declare -i hang=0 declare -i sum=0 for i in `ls /var/log/*.log` do log[$j]=$i if [[ $j%2 -eq 0 ]];then hang=$(cat ${log[$j]}|wc -l) sum=$sum+$hang fi let j++ done echo $sum
#!/bin/bash declare -i sum=0 declare -i a=0 declare -a files files=(/var/log/*.log) for a in `seq 0 $[${#files[*]}-1]` do if [[ $a%2 -eq 0 ]];then hang=$(cat ${files[$a]} | wc -l) sum=$sum+$hang fi done echo "Lines: $sum"
2、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
#!/bin/bash # #输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序 declare -a Num declare -i i declare -i j Num=($@) let Count=${#Num[@]}-1 for((i=0;i<=$Count;i++)) do for j in `seq 0 $Count` do if [ ${Num[i]} -lt ${Num[j]} ];then max=${Num[j]} Num[j]=${Num[i]} Num[i]=$max fi done done echo ${Num[@]}
root@cenots6.8 /testdir # ./maopao.sh 234 5 65 7657 87 98 3455 5 65 87 98 234 3455 7657
3、让用户(管理员或所有用户)的PATH环境变量的值多出一个路径,例如: /usr/local/apache2/bin
cd /etc/profile.d/ vim apache.sh PATH=$PATH:/usr/local/apache2/bin 保存退出vim . apache.sh 或者重新登陆即可
4、用户wang登录时自动启用别名rm=‘rm –i’
su -wang vim ~/.bashrc alias rm=‘rm –i’ 保存退出vim source ./bashrc
5、用户登录时,显示红色字体的警示提醒信息“ hi,dangerous!”
cd /etc/profile.d/ vim login.sh echo “hi,dangerous” 保存退出vim . login.sh 或者重新登陆即可
原创文章,作者:Naruto,如若转载,请注明出处:http://www.178linux.com/39456