shell脚本变成之数组、字符串处理及其它功能补充

数组定义:

                 能够存储多个元素的内存空间,每个元素在数组中具有特定的索引编号,我们可以通过变量名和索引编号来查看数组中的某一元素。

        数组分类:

                 索引数组

                                定义:索引编号从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

(6)
NarutoNaruto
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • 马哥教育网络班21期+第五周课程练习

    第五周作业 1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; cat /boot/grub/grub.conf  | grep "^[[:space:]]\+" 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至…

    Linux干货 2016-10-17
  • 三剑客之一sed命令

    sed sed ‘2p’ /etc/passwd  打印paswwd的第二行 这样执行结果看能看出第二行显示两次 sed -n ‘2p’ /etc/passwd -n 执行后 会取出当前行显示. n是关闭打印  例如[root@cent7 ~]#ifconfig ens33|sed -n &…

    Linux干货 2017-08-13
  • 马哥教育网络班21期+第14周课程练习

    系统的INPUT和OUTPUT默认策略为DROP; iptables -P INPUT DROP iptables -P OUTPUT DROP 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响…

    Linux干货 2016-10-09
  • 推荐-Centos常用的进程管理和资源查看工具

    一、pstree     pstree命令以树状图的方式展现进程之间的派生关系 -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;  -c:不使用精简标示法;  -G:使用VT100终端机的列绘图字符;  -h:列出树状图时,特别标明现在执行的程序;  -H<…

    Linux干货 2016-04-05
  • 一些不起眼但非常有用的 Vim 命令

    原文出处: xmodulo   译文出处:linux.cn – wangjiezhe   如果我的关于这个话题的最新帖子没有提醒到你的话,那我明确地说,我是一个 Vim 的粉丝。所以在你们中的某些人向我扔石头之前,我先向你们展示一系列“鲜为人知的 Vim 命令”。我的意思是,一些你可能以…

    Linux干货 2015-03-09
  • 开始学习总结的一些基本知识点

       第一VNC软件(面授班课堂用的),这款软件采用C/S架构(client/sever客户端和服务器端)还有VNC协议(virtual Network computing虚拟网络计算)协议。虽说这款软件对网络班没有实际用途,但自己了解下这款软件的构成也是不错的。    第二开始学习需要的虚拟机软件其中包括VMWARE…

    Linux干货 2016-10-29