Shell脚本 - 数组 | 冒泡算法 | 直接排序 | IPV4进制转换 | 超详细

一、数组定义方法

(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 ""

猜你喜欢

转载自blog.csdn.net/qq_42427971/article/details/114676821