一、数组
数组:是一种数据结构,
数据序列,连续的多个数据,可以使用索引获取相关元素
声明数组:
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