一、数组

数组:是一种数据结构,

    数据序列,连续的多个数据,可以使用索引获取相关元素

声明数组:

   declare -a ARRAYNAME  # 可以不事先声明

初始化赋值:

   ARRAYNAME=(“STRING1” "STRING2"...)   #使用空格隔开

   ARRAYNAME=("STRING1" [4]="STRING2"...)

   ARRAYNAME[0]="STRING1" ARRYNAME[3]="STRING3"

获取数组中所有元素:${ARRARYNAME[@],${ARRAYNAME[*]}

获取数组中有效元素的总个数:${#ARRAYNAME[@]}${#ARRAYNAME[*]}

获取某一元素中字符串的长度:${#ARRAYNAME[INDEX]} (INDEX=0,1,2,3...)


例:

[root@xxj shell]# echo ${color[0]}
red
[root@xxj shell]# echo ${color[1]}
bule
[root@xxj shell]# echo ${color[2]}
gree
[root@xxj shell]# echo $color[2] 
red[2]
[root@xxj shell]# echo $color         #数组不指定引用其第几个元素默认是引用第一个元素
red
[root@xxj ~]# x=(nihao "s b" [4]='ruozhi')
[root@xxj ~]# echo ${x[5]} 
               
[root@xxj ~]# echo ${x[2]}

[root@xxj ~]# echo ${x[1]}
s b
[root@xxj ~]# echo ${x[4]}
ruozhi
[root@xxj ~]# x=(333 22 4444 555555555)
[root@xxj ~]# echo ${#x[1]}
2
[root@xxj ~]# echo ${#x[3]}
9

传统数组和关联数组

  数组索引为数字的是传统数组

  数组索引为字符串的是关联数组

  在bash中传统数组可以不事先定义# declare -a,而关联数组必须事先定义# declare -A,awk中都可以不事先定义

# 传统数组
[root@Node5 ~]# Test=([0]=a [2]=c)
[root@Node5 ~]# echo $Test
a
[root@Node5 ~]# echo $Test[2]
a[2]
[root@Node5 ~]# echo ${Test[2]}
c

# 关联数组
[root@Node5 ~]# Test1=([a]=AA [c]=CC)
[root@Node5 ~]# echo $Test1
CC
[root@Node5 ~]# echo $Test1[0]
CC[0]
[root@Node5 ~]# echo ${Test1[0]}
CC
[root@Node5 ~]# echo ${Test1[a]}
CC

[root@Node5 ~]# declare -A Test2=([a]=AA [c]=CC)

[root@Node5 ~]# echo ${Test2[a]}
AA
[root@Node5 ~]# echo ${Test2[0]}

[root@Node5 ~]# echo ${Test2[c]}
CC
[root@Node5 ~]#


二、bash伪随机数生成器

$RANDOM

[root@Note3 ~]# echo $RANDOM
4852
[root@Note3 ~]# echo $RANDOM
3161
[root@Note3 ~]# echo $RANDOM
23935
[root@Note3 ~]# echo $[RANDOM%40]
26
[root@Note3 ~]# echo $[RANDOM%40]
21
[root@Note3 ~]# echo $[RANDOM%40]
16


练习:

1、打印九九乘法表

[root@xxj shell]# cat 12.sh
#!/bin/bash
n=('1' '2' '3' '4' '5' '6' '7' '8' '9')
for x in $(seq 0 8);do
    for y in $(seq 0 $x);do
        echo -e -n "${n[y]}x${n[x]}=$[${n[x]}*${n[y]}]\t"
        done
   echo
done

[root@xxj shell]# bash 12.sh
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

2、通过脚本生成N个随机数(N>5),对这些随机数按从小到大排序(冒泡排序)


3、从所有同学们中挑选随机任意位

   

三、字符串处理

1、字符串切片

${#var}

   返回字符串变量var的长度

${var:offset}

   从最左侧跳过offset字符,返回字符串变量var中从第offset个字符不包括第offset个字符)的字符开始,到最后的部分,offset的取值0 到${#var}-1 之间

${var: -offset}:

   取字符串的最右侧几个字符,使用空格或括号

        相当于自左而有跳过${#var} - n 个字符,返回后面的字符串

[root@Node1 ~]# name="xie xiao jun"
[root@Node1 ~]# echo ${#name}
12
[root@Node1 ~]# echo ${name:4}
xiao jun
[root@Node1 ~]# echo ${name:-4}
xie xiao jun
[root@Node1 ~]# echo ${name:(-4)}
jun
[root@Node1 ~]# echo ${name: -5}
o jun

${var:offset:number}:

   返回字符串变量var 中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分

${var: -offset:number}:

      返回字符串变量var 中从第${#var}-offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分

${var:offset: -number}:

   从最左侧跳过offset 字符,一直取到字符串的最右侧number个字符之前(抛头去尾取中间)(bash4.2后才支持)

截取hello字符串:
# VAR='hello world!'
# echo ${VAR:0:5}
hello
截取world字符串:
# echo ${VAR:5:-1}
world
截取最后一个字符:
# echo ${VAR:(-1)}    #使用空格隔开也可以
!

${#var}:

[root@Note3 ~]# name="xie jun"
[root@Note3 ~]# arr1=(str1 str22 str333)
[root@Note3 ~]# echo $name
xie jun
[root@Note3 ~]# echo $arr1
str1
[root@Note3 ~]# echo $#name
0name
[root@Note3 ~]# echo ${#name}
7
[root@Note3 ~]# echo ${#arr1}      #数组返回的是第一个元素的长度
4

${var:offset}

[root@Note3 ~]# echo ${name:0}    #从0开始
xie jun
[root@Note3 ~]# echo ${name:1}
ie jun
[root@Note3 ~]# echo ${name:5}   #空格也算一个字符
un
[root@Note3 ~]# echo ${name:-5}
xie jun
[root@Note3 ~]# echo ${name: -5}  #使用负值要使用空格,负值表示从右往左数
e jun
[root@Note3 ~]# echo ${arr1:1}
tr1
[root@Note3 ~]# echo ${arr1[1]:1}
tr22

${var:offset:number}:

[root@Note3 ~]# echo ${name:1:1}
i
[root@Note3 ~]# echo ${name:3:3}
ju
[root@Note3 ~]# echo ${name:3:10}
jun
[root@Note3 ~]# echo ${name:10:10}

[root@Note3 ~]# echo ${name:-1:10}    #没使用空格,无效
xie jun
[root@Note3 ~]# echo ${name: -1:10}
n
[root@Note3 ~]# echo ${name: -5:10}
e jun


2、字符串截取

${var#*word}:其中word可以是指定的任意字符

功能:

   自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符

${var##*word}:同上,

   不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容(即贪婪模式的删除)

[root@Node1 ~]# echo $name
xie xiao jun
[root@Node1 ~]# echo ${name#s}
xie xiao jun
[root@Node1 ~]# echo ${name#*ia}
o jun
[root@Node1 ~]# echo ${name#*i}
e xiao jun
[root@Node1 ~]# echo ${name##*i}
ao jun

${var%word*}:其中word可以是指定的任意字符;

功能:

   自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;

${var%%word*}:同上,

   只不过删除字符串最右侧的字符向左至最后一次出现word 字符之间的所有字符,(贪婪模式);

注意:

   支持使用通配符,不支持正则表达式

[root@Note3 ~]# str="i very very love linux "
[root@Note3 ~]# echo ${str#*e}
ry very love linux
[root@Note3 ~]# echo ${str##*e}
linux

[root@Note3 ~]# echo ${str%e*}
i very very lov
[root@Note3 ~]# echo ${str%%e*}
i v


3、字符串查找替换

${var/pattern/substi}:

   查找var所表示的字符串中,第一次被pattern 所匹配到的字符串,以substi替换之

${var//pattern/substi}:

   查找var所表示的字符串中,所有能被pattern 所匹配到的字符串,以substi 替换之(全局替换)

${var/#pattern/substi}

   查找var 所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之

${var/%pattern/substi}

   查找var 所表示的字符串中,行尾被pattern 所匹配到的字符串,以substi 替换之

${var/pattern[/]}:查找var 所表示的字符串中,删除第一次pattern 所匹配到的字符串

注意:

   支持使用通配符,不支持正则表达式

[root@Note3 ~]# echo ${str/e.y/sb}      #不支持正则表达式
i very very love linux
[root@Note3 ~]# echo ${str/e?y/sb}      #支持通配符
i vsb very love linux
[root@Note3 ~]# echo ${str/e[a-z]y/sb}
i vsb very love linux
[root@Note3 ~]# echo ${str//e?y/sb}
i vsb vsb love linux

[root@Note3 ~]# echo ${str/#i/sb}
sb very very love linux
[root@Note3 ~]# echo ${str/%i/sb}
i very very love linux
[root@Note3 ~]# echo ${str/%ux/sb}
i very very love linux
[root@Note3 ~]# echo ${str/%u/sb}
i very very love linux
[root@Note3 ~]# echo ${str/%x/sb}
i very very love linux
[root@Note3 ~]# echo ${str/%?/sb}
i very very love linuxsb

#查找删除(替换为空)
[root@Note3 ~]# str="i very very love linux"
[root@Note3 ~]# echo ${str/%linux}
i very very love
[root@Note3 ~]# echo ${str/%linux/}
i very very love
[root@Note3 ~]# echo ${str/i/}
very very love linux
[root@Note3 ~]# echo ${str/i v/}
ery very love linux
[root@Note3 ~]# echo ${str/i v}
ery very love linux
[root@Note3 ~]# echo ${str/v}
i ery very love linux
[root@Note3 ~]# echo ${str//v}
i ery ery loe linux


4、字符大小写转换

${var^^}:把var 中的所有小写字母转换为大写

${var,,}:把var 中的所有大写字母转换为小写

[root@Note3 ~]# echo ${str^^}
I VERY VERY LOVE LINUX
[root@Note3 ~]# echo ${str,,}
i very very love linux


5、变量赋值

${var:-value}:如果var为空或未设置,那么返回value ;否则,返回var的值

${var:+value}:如果var不空,则返回value ,否则返回var的值即空值

${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则返回var的值

${var:?error_info}:如果var为空或未设置,那么在当前终端打印error_info;否则返回var的值

[root@Note3 ~]# echo $str
i very very love linux
[root@Note3 ~]# echo $xj

[root@Note3 ~]# echo ${str:-xiejun}
i very very love linux
[root@Note3 ~]# echo ${xj:-xiejun}
xiejun
[root@Note3 ~]# echo ${str:xiejun}
i very very love linux
[root@Note3 ~]# echo ${str:+xiejun}
xiejun
[root@Note3 ~]# echo ${xj:xiejun}

[root@Note3 ~]# echo ${xj:+xiejun}

[root@Note3 ~]# echo ${str:=xiejun}
i very very love linux
[root@Note3 ~]# echo ${xj:=xiejun}
xiejun
[root@Note3 ~]# echo $xjj

[root@Note3 ~]# echo ${xjj:?xiejun}
-bash: xjj: xiejun
[root@Note3 ~]# echo $xjj