数组分为:数组和关联数组


数组:

  数组: 数组名+索引来标记一个数组元素

     数组索引的表示方式:a[index]、a[1] 、a[10](第一个是a[0],因为bash是基于C语言开发的)


关联数组:

        bash 4.0以后支持微数字索引(就是可以引用个单词):这种数组称为关联数组

        查看bash的版本命令:[root@ning .ssh]# bash --version


关联数组引用方式a[ning] b[hong]


声明数组方式:

            declare -i表示一个整数

                    -a表示一个数组

                    -A是个关联数组


数组支持稀疏格式:就是说,赋值的时候不一定安装顺序来赋值,自动识别赋值序号

            [root@ning ~]# a=([0]=ning [8]=hong [7]=liang)


数组赋值赋值:方式:

        1、一次对一个元素赋值:

                a[0]=$RANDOM

        2、一次对全部元素赋值:(用小括号括起来,里面使用空格隔开)是按照次序赋值的。


                示例:

                        a=(ning hong liang)

                        [root@ning ~]# a=(ning hong liang )

                        [root@ning ~]# echo ${a[0]}

                         ning

        3、按索引进行赋值:


                示例:

                        [root@ning ~]# a=([0]=ning [8]=hong [7]=liang)

                        [root@ning ~]# echo ${a[0]}

                        ning

                        [root@ning ~]# echo ${a[7]}

                        liang

        4、命令替换赋值:


                示例:

                        [root@ning ~]# A=($(ls /root/))

                        [root@ning ~]# echo ${A[9]}

                        install.log

                        

                        [root@ning ~]# A=(/home/*)

                        [root@ning ~]# echo ${A[5]}

                        /home/ning

                        [root@ning ~]# echo ${A[2]}

                        /home/fedora

        5、用户输入:

                    read -a 数组名字

                示例:

                        [root@ning ~]# read -a B

                        A D F G H J K L

                        [root@ning ~]# echo ${B[0]}

                        A

                        [root@ning ~]# echo ${B[2]}

                        F

    

数组的访问:

        1、用索引访问:

                数组[索引号]

                [root@ning ~]# echo ${a[0]}

        2、数组长度

                示例 :

                 (1)数组的字符个数

                            [root@ning ~]# h=fsdafsafg

                            [root@ning ~]# echo ${#h}

                            9

                 (2)数组的元素个数

                            [root@ning ~]# d=(ning hong liang)

                            [root@ning ~]# echo ${#d[*]}

                            3

                            或者

                            [root@ning ~]# d=(ning hong liang)

                            [root@ning ~]# echo ${#d[@]}

                            3

                 (3)数组中元素中的字符个数

                            [root@ning ~]# d=(ning hong liang)

                            [root@ning ~]# echo ${#d[3]}

                            5

                            [root@ning ~]# echo ${#d}---不加索引默认是第一个元素的字符个数

                            4

                            [root@ning ~]# echo $d------不加#号代表的显示的是第一个元素

                            ning


    案例:生成10个随机数,保存至数组中,而后显示偶数元素

                        #!/bin/bash

                        for i in {0..9}; do

                                num[$i]=$RANDOM------生成随机的数

                        

                                [ $[$i%2] -eq 0 ] && echo  ${num[$i]}

                        done


    从数组中挑选某元素


      1、${ARRAY[@]:offset:number}:取出

        切片:offset:偏移的元素个数

          number:偏移后取出的个数

                 示例:

                        [root@ning ~]# d=(ning hong liang)

                        [root@ning ~]# echo ${d[@]:1:1}--偏移为1,取出个数为1

                        hong

      2、${ARRAY[@]:offset}:取出偏移量后的所有元素

                 示例:

                        [root@ning ~]# d=(ning hong liang)

                        [root@ning ~]# echo ${d[@]:1}

                        hong liang

      3、 ${ARRAY[@]:offset:number}:取出偏移量后的前两个元素

                 示例:

                        [root@ning ~]# d=(ning hong liang)

                        [root@ning ~]# echo ${d[@]:0:2}

                        ning hong

      4、 ${ARRAY[@]}:显示所有元素([*]也可以的)

                 示例:

                        [root@ning ~]# d=(ning hong liang)

                        [root@ning ~]# echo ${d[@]}

                        ning hong liang

        

数组复制:

        ${ARRAY[@]}---显示所有元素

        ${#ARAY{@}}----显示所有元素的个数

        

    $@和$*区别:

            $@:每个参数当作一个独立的串(是空格分开的多个串)

            $*:所有的参数当作一个串


数组复制:

    示例:复制一个A数组下标为偶数的元素至一个新B数组中


            #!/bin/bash

            declare -a B-----声明B是个数组

            

            A=(a0 a1 a2 a3 a4 a5 a6 a7 a8)----指明数组中的元素

            

                echo ${A[@]}------显示下A数组中的内容。

            for i in `seq 0 ${#A[@]}`; do

                    if [ $[$i%2] -eq 0 ]; then

                            num=${#B[@]}----再次统计符合条件的元素数量,并赋值给num

                            B[$num]=${A[$i]}----用统计的数量当作B的下标给B赋值

                    fi

            done

            echo "${ning[@]}"


删除数组中的元素:

          unset ARRAY[index] ------删除一个元素或撤销变量本身


               [root@ning ~]# a=(ning hong liang)

               [root@ning ~]# echo ${a[@]}

               ning hong liang

               [root@ning ~]# unset a[1]----撤销元素

               [root@ning ~]# echo ${a[@]}

               ning liang

               [root@ning ~]# unset a--------撤销整个变量

        


bash中字符串取操作

             字串切片

                    ning='ninghongliang'

                    echo ${ning:2:4}----取第二个开始的后面4个字串

                    echo ${ning: -2}---取尾部的指定字字串

取子串:基于模式

  ${variable#*word}---自左而右,第一次出现的word,删除开始到此word的内容,,显示剩下的内容

  ${variable##*word}-----自左而右删除最后一个word出现前的内容,显示剩下的内容--贪婪模式

  ${variable%word*}-----自右而左,第一次出现的word,删除开始到此word的内容,,显示剩下的内容

  ${variable%%word*}-----自右而左删除最后一个word出现前的内容,显示剩下的内容--贪婪模式


    示例:

        [root@localhost ~]# file=/var/log/messages

        [root@localhost ~]# echo ${file#*e}

        ssages

        [root@localhost ~]# echo ${file##*e}

        s

        [root@localhost ~]# echo ${file%e*}

        /var/log/messag

        [root@localhost ~]# echo ${file%%e*}

        /var/log/m


bash内置查找替换:

    ${variable/pattern/substi}替换第一次出现

            [root@ning ~]# A=`tail -1 /etc/passwd`

            [root@ning ~]# echo ${A/dhcpd/ning}

            ning:x:177:177:DHCP server:/:/sbin/nologin

    ${variable//pattern/substi}----替换所有

            [root@ning ~]# echo ${A//177/188}

            dhcpd:x:188:188:DHCP server:/:/sbin/nologin

    

    ${variable/#pattern/substi}------行首谋定行首替换行首

            [root@ning ~]# echo ${A/#dhcpd/B}

            B:x:177:177:dhcpd server:/:/sbin/nologin

    

    ${bariable/%pattern/substi}-----替换行尾谋定行尾

            [root@ning ~]# echo ${A/%nologin/B}

            nologin:x:177:177:DHCP server:/:/sbin/B



查找删除

        ${variable/pattern}--删除第一次出现

        ${variable//pattern}----删除所有

            [root@ning ~]# echo ${A//177}

            dhcpd:x:::DHCP server:/:/sbin/nologin

        ${bianliang/#bash}------行首谋定行首删除行首

        ${bianliang/%bash}-----删除行尾谋定行尾


大小写转换

    小---大${bianliang^^}全部换成大写

            [root@ning ~]# echo ${A^^}

            DHCPD:X:177:177:DHCP SERVER:/:/SBIN/NOLOGIN

    大---小${bianliang,,}全部换成小写

     ${bianliang,,s}---对单个子串

            [root@ning ~]# echo ${A^^v}---------对变量中把所有的v转换成V

            dhcpd:x:177:177:DHCP serVer:/:/sbin/nologin


变量赋值操作

    ${bianliang:-string}

        bianliang为空或未设定,那么范围string,否则,返回biang变量的值

    ${bianliang:=string}

        bianliang 为空或未定,那么返回string,且string赋值给变量bianliang,否则返回bianliang

    

 为脚本使用配置文件,并确保某变量有可用值的方式

    biangliang=${bianliang:-default vaule}

        HOSTNAME=${HOSTNAME:-ning}

    

示例:读取/etc/sysconfig/network文件,利用其HOSTNAME变量的值设置主机名

            #!/bin/bash

            #. /etc/sysconfig/network-----调用配置文件来执行

            [ -f /etc/sysconfig/network ] && source /etc/sysconfig/network-------判断加调用

            HOSTNAME=${HOSTNAME:-ning}

            echo $HOSTNAME

             


示例:打印九九乘法表

            #!/bin/bash

            

            for i in `seq 1 9`; do

                    for j in `seq 1 $i`; do

                        echo -ne "$i*$j=$[$i*$j]\t"

                    done

                    echo 

            done