Shell脚本 - 数组
一、数组定义方法
(1 2 3 4 5 6)
0 1 2 3 4 5
以空格为分割
数组的单位叫元素
从左往右从0
开始索引[下标]
方法一 用的最多的
数组名=(vaule0 vaule1 vaule2 ...)
方法二 会覆盖原有数组内容
数组名=([0]=vaule [1]=vaule [2]=vaule ...)
方法三 会覆盖原有数组内容
列表名="vaule0 vaule1 vaule2 ..."
数组名=($列表名)
方法四 灵活性最高
数组名[0]="vaule"
数组名[1]="vaule"
数组名[2]="vaule"
举例:
a=0
for i in `ls /shell`
do
b[$a]=$i
let a++
done
echo ${b[*]}
二、数组包括的数据类型
数值类型 | 字符类型
使用" "或’ '定义
获取数组长度
echo ${#array[@]}
echo ${#array[*]}
获取数据列表
echo ${array[@]}
echo ${array[*]}
读取某下标赋值
echo ${array[索引值]}
当加上双引号后*将会变成整体
array=(1 2 3 4 5)
for i in ${array[*]}
do
echo $i
done
三、数组切片
获取array所有数据中索引号从0开始到第3个元素,没有定义的元素不会输出
array=(1 2 3 4 5)
echo ${array[@]:0:3}
四、数组替换
将查找的字符0临时替换为3,下一次执行依旧是在原有数值进行替换
如果需要保存就先赋值
array=(10 20 30 40 50)
echo ${array[@]/0/8}
五、数组删除
删除数组
array=(1 2 3 4 5)
unset array
删除指定索引的元素
unset array[1]
六、数组追加元素
方法一
array[index]=value
方法二
array[${#array[@]}]=value
方法三
如果加上双引号后*的情况下将会在最后一个索引处追加元素,它们为同一个整体
array=("$(array[@])" vaule1 ... valueN)
方法四
array+=(vaule1 ... valueN)
七、向函数传数组参数
如果将数组作为函数参数,参数只会取数组的遍历的第一个值
dmo(){
echo $@
a=($i)
echo ""新数组的值为 ${a[*]}
}
如果将数组遍历作为函数参数
demo(){
newarrary=($@)
for ((i=0;i<=$[$# - 1];i++)){
newarrary[$i]=$[${newarrary[$i]} * 2]
}
echo ${newarrary[*]}
}
array=(3 2 1 4 5)
echo "原始数组的值为: ${array[*]}"
result1=`demo ${
array[*]}`
echo "新数组的和为:$result1"
八、冒泡算法
比较两个相邻的元素,将值大的元素交换到右边
算法思路
依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面
方法一
array=(2 4 3 5 1)
echo "旧数组值:${array[*]}"
a=${#array[*]}
for ((i=1;i<a;i++)){
for ((j=0;j<a-i;j++)){
if [ ${array[j]} -gt ${array[j+1]} ];then
bak=${array[j]}
array[j]=${array[j+1]}
array[j+1]=$bak
fi
}
}
echo "新数组值:${array[*]}"
方法二
#!/bin/bash
paixu() {
array=($@)
echo "旧数组值:${array[*]}"
a=${#array[*]}
for ((i=1;i<a;i++)){
for ((j=0;j<a-i;j++)){
if [ ${array[j]} -gt ${array[j+1]} ];then
bak=${array[j]}
array[j]=${array[j+1]}
array[j+1]=$bak
fi
}
}
echo "新数组值:${array[*]}"
}
list=$@
paixu $list
九、直接选择排序
与冒泡排序相比,直接选择排序的交换次数更少,所以速度更快一些
基本思想
直接找到最大值丢到后面,而不需要一个一个判断
array=($RANDOM $RANDOM $RANDOM $RANDOM $RANDOM)
echo "原数组为:${array[*]}"
long=${#array[*]}
for ((i=1;i<$long;i++)){
index=0
for ((k=1;k<=long-i;k++)){
one=${array[$index]}
two=${array[$k]}
if [ $two -gt $one ];then
index=$k
fi
last=$[$long-$i]
temp=${array[$last]}
array[$last]=${array[$index]}
array[$index]=$temp
}
}
echo "排序后的数组为:${array[*]}"
十、IPV4进制转换
#!/bin/bash
ip=(`ifconfig | grep "inet" | awk 'NR==1{print $2}' | tr '.' ' '`)
for ((i=0;i<4;i++)){
arr=(`echo "obase=2;${ip[$i]}" | bc | tr '\n' ' '`)
if [ ${#arr[$@]} -ne 8 ];then
num=$[ 8 - ${#arr[$@]} ]
unset arr[$[8-$num]]
for ((k=0;k<$num;k++)){
echo -n 0
}
fi
echo -n ${arr[@]}
}
echo ""