数组的简介和使用。数组就是生命一组数的容器。
1, 声明数组:#declare -a arrayname,
2
,数组赋值:
array=
(
a1 a2 a3 a4……
)多个值之间用空格隔开这是对整个数组赋值,也可以给单个数组赋值使用
array[0]=a1 array[1]=a2
的方式
3
,数组的引用:
${arrayname[1]}
需要注意的是引用数组时要用一组花括号引起来。当需要引用数组中全部的值时可以
*
和
@
两个特殊符号例:
echo ${arrayname[@]}
或者
${arrayname[*]}
这两种方式,有时我们还有一种需求就是只显示数组值的个数使用:
echo ${#arrayname[@]}
来显示的
4
,注销数组使用
unset arrayname
5
,提取字符串中某些字符的方式:
例如我们声明一个变量并赋了值,但是需要这个字符串中的部分内容,我们来举例说明:
#FILE=
“
/etc/sysconfig/network
”
我们声明了一个变量并赋了值,但是提取部分字符例如需要
etc
后面的内容就需要使用
${FILE:4}
这样显示的就是
etc
后面的
/sysconfig/network
的内容了。
说明:
${FILE:n}:n
代表提取在某一字符串从左向后偏移
n
个字符以后的内容
${FILE:n:m}:
表示代表提取在某一字符串从左向后偏移
n
个字符以后
m
个字符
例
echo ${FILE:4:10}
就会显示
/sysconfig
的内容
有时还有一种需求就是提取字符串以什么为分割的以左或以右的内容
方法
:
${varible##*string}
从左向右截取最后一个
string
后的字符串
${varible#*string}
从左向右截取第一个
string
后的字符串
${varible%%string*}
从右向左截取最后一个
string
后的字符串
${varible%string*}
从右向左截取第一个
string
后的字符串
例如:
FILE=
“
/etc/rc.d/rc.sysinit
”
echo ${FILE#*/}
显示:
etc/rc.d/rc.sysinit
就是以自左向右第一次出现
/
为分割的内容
echo ${FILE##*/}
显示:
rc.sysinit
就是自左向右最后一次出现
/
以后的内容
echo ${FILE%/*}
显示:
/etc/rc.d
正好与
#
的表达相反自右向左第一次出现
/
以前的内容
echo ${FILE%%/*}
显示:空
因为最后一次出现
/
以前没有内容了,所以不显示
这么字符串的截取的方式对
shell
脚本的有时去非常有用的。
同时我们系统也内置了一些变量例如
RANDOM
就定义了一组随机数字
我们可以使用
echo $RABDOM
来显示,与随机数结合有一种用法,可以对随机数取余可以得到随机的一个数值但是这个数不会大于取余的那个数例如我们可以对
10
取余得到的数就不会大于
10
,而且这个数还是随机出现的。
这里我们提下怎么样对数组排序:使用选择排序和冒泡排序
选择排序思想:设待排序
n
个元素存放在数组
a[n-1]
中然后进行
n-1
次循环,假设第一个数为最小值赋给一个虚拟空间从第二个值开始循环依次和之前比较然后如果出现比他还小的值就对调位置
例子:
#!/bin/bash
values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
numvalues=${#values[@]}
for (( i=0; i < numvalues; i++ )); do
lowest=$i
for (( j=i+1; j < numvalues; j++ )); do
if [ ${values[j]} -le ${values[$lowest]} ]; then
lowest=$j
fi
done
temp=${values[i]}
values[i]=${values[lowest]}
values[lowest]=$temp
done
for (( i=0; i < numvalues; i++ )); do
echo -ne "${values[$i]}\t"
done
冒泡排序的思想:设待排序
n
个元素存放在数组
a[n-1]
中
,
无序区范围初始为
(a(0),a(1),a(2),...,a[n-1]),
冒泡排序方法是在当前无序区内
,
从最上面的元素
a[0]
开始
,
对每两个相邻的元素
a[i+1]
和
a[i](i=0,1,...,n-1)
进行比较
,
且使值较小的元素换至值较大的元素之上
(
若
a[i]>a[i+1],
则
a[i]
和
a[i+1]
的值互换
),
这样经过一趟冒泡排序后
,
假设最后下移的元素为
a[k],
则无序区中值较大的几个元素到达下端并从小到大依次存放在
a[k+1],a[k+2],...a[n-1]
中
,
这样无序区范围变为
(a[0],a[1],a[2],...,a[k])
。在当前无序区内进行下一趟冒泡排序。这个过程一直到某一趟排序中不出现元素交换的动作,排序结束。整个排序过程最多执行
n-1
遍。这种排序方法是通过相邻元素之间的比较与交换,使值较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。故称为冒泡排序法。
例子:
values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
#
获取
values
的个数
numvalues=${#values[@]}
for (( i=0; i < numvalues; i++));do
ischanged=false
for((j=numvalues-1; j> i; j--));do
#
如果轻的在下交换之,每次
i
的循环,都可以见最轻的放置在最上,并调整其他的位置,使之更为有序
if [ ${values[j]} -lt ${values[j-1]} ];then
temp=${values[j]}
values[j]=${values[j-1]}
values[j-1]=$temp
ischanged=true
fi
done
#
如果已经不需要调整,即有序,就跳出循环。
if [ ischanged = "false" ] ;then
break;
fi
done
}