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

相关推荐

  • Redis基于Sentinel哨兵高可用方案

    下载最新redis版本,当前最新版本为  2.8.19  2014-12-30 安装redis 首页地址:http://redis.io/ 最新稳定版下载地址: http://download.redis.io/releases/redis-2.8.19.tar.gz # tar -xvf redis-2.8.19.tar.gz # cd…

    2015-03-03
  • Linux中的包管理

    1. RPM介绍 rpm是linux中的包管理软件,通过rpm用户可以对rpm包进行查询、安装、卸载、升级和校验等操作。 1.1 查询 查询 -q:可以查看某个包是否已经安装 -qa:查看系统已经安装的所有包 -qi:查询某个安装包的详细情况 -ql:查询安装某个包之后会生成哪些文件 -qc:查询某个软件的配置文件 -qd:查询某个软件的所有文档 &#821…

    Linux干货 2017-04-17
  • 【26期】Linux第九周学习小总结

    本周带来的是慢慢的技术分享,有关于计划任务的分享,涉及的知识点主要是at和cron,crontab的详解,计划任务可以将任何脚本、程序或文档安排在某个最方便的时间运行,有利于我们的自动化运维,当某项任务多次重复,或者某个指定的时间点多次执行时,就可以使用计划任务方便我们的工作。

    2017-09-09
  • N26-博客作业-week15

    1、总结sed和awk的详细用法 sed: 语法结构 sed [OPTION]…’script’ [input-file]…[action] -r:支持扩展正则表达式 -n:不输出模式空间中的内容至屏幕 -e script1 -e script2 -e script3:指定多脚本运行 -f /path/to/script_file:从指定的文件中读取…

    Linux干货 2017-07-14
  • 描述器

    Edit 描述器 |[Descriptors] 描述器的表现 用到3个魔术方法:__get__()、__set__()、__delete__() 方法用法: object.__get__(self,instance,owner) object.__set__(self,instance,value) object.__delete__(self,instan…

    Linux干货 2017-11-29