Shell函数和数组(想不出来骚话了,就这样吧,累了,都毁灭吧,赶紧的)


Shell函数

函数

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列
  • Shell函数定义
[ function ] 函数名(){
    
    
命令序列
[ return x ]
}
  • 调用函数的方法
函数名 [参数1][参数2]

在Shell脚本中函数的执行并不会开启一个新的子Shell,而是仅在当前定义的Shell环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。

函数的作用范围

  • 函数在Shell脚本中国仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令

函数的参数

  • 参数的用法
    函数名称 参数1 参数2 参数3 …
  • 参数的表示方法
    $1 $2 $3 … ${10} ${11} …

数组

数组定义方法

  1. 依次赋值
    数组名=(value0 value1 value2 ...)

  2. 跨越式赋值
    数组名=([0]=value [1]=value [2]=value ...) #[0]、[1]、[2]是下标(索引)

  3. 列表赋值
    列表名="value0 value1 value2 ..." 数组名=($列表名)

  4. 下标(索引)赋值
    数组名[0]="value" 数组名[1]="value" 数组名[2]="value"

数组包括的数据类型

  • 数值类型
  • 字符类型
    使用" "' '定义

获取数组长度

代码如下:

arr_number=(1 2 3 4 5)
arr_length=${
    
    #arr_number[*]}
           ${
    
    #arr_number[@]}

echo $arr_length

读取某下标赋值

代码如下:

arr_index2=${
    
    #arr_number[2]}
echo $arr_index2

数组遍历

#!/bin/bash
arr_number=(1 2 3 4 5)
for i in ${
    
    arr_number[@]}
do
echo $i
done

数组切片

arr=(1 2 3 4 5)
echo ${
    
    arr[@]}          #输出整个数组

echo ${
    
    arr[@]:1:2}      #获取 ${
    
    数组名[@或*]:起始位置:长度} 的值

echo ${
    
    arr[@]:2:3}

数组替换

arr=(1 2 3 4 5)

echo ${
    
    arr[@]/4/66}      #${
    
    数组名[@或*]/查找字符/替换字符}
echo ${
    
    arr[@]}           #并不会替换数组原有内容

arr=(${
    
    arr[@]/4/66})     #要实现改变原有数组,可通过重新赋值实现
echo ${
    
    arr[@]}

数组删除

arr=(1 2 3 4 5)
unset arr            #删除数组
echo ${
    
    arr[*]}

arr=(1 2 3 4 5)
unset arr[2]        #删除下标为 2 的元素(即第三个元素)
echo ${
    
    arr[*]}

数组追加元素

方法一:
通过下标来追加元素

array_name[index]=value

方法二:
将数组的长度作为下标来追加元素

array_name[${#array_name[@]}]=value

方法三:
重新整合数组,然后在后面追加

array_name=("${array_name[@]}"value1 ... valueN)
#双引号不能省略,否则当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
#不能将“@”替换成“*”,否则会将数组array_name中的所有元素作为一个元素添加到数组中

方法四:
直接追加

array_name+=(value1 ... valueN)
#待添加元素必须用“()”包围起来,并且多个元素之间用空格分隔

向函数传数组参数

如果将数组变量作为函数参数,函数只会取数组变量的第一个值

test() {
    
    
  echo "接收到的参数列表:$@"
  newarrary=$1
  echo "新数组的值为:${newarrary[*]}"
}

array=(3 2 1 4 5)
echo "原数组的值为:${array[*]}"
test1 $array

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量

test2(){
    
    
  newarrary=($(echo $@))
  echo "新数组的值为:${newarrary[*]}"

}

arrary=(3 2 1 4 5)
echo "原始数组的值为:${arrary[*]}"
test2 ${
    
    arrary[*]}

从函数返回数组

test2() {
    
    
   newarrary=(`echo $@`)

   sum=0
   for value in ${
    
    newarrary[*]}
   do
     sum=$[$sum + $value]
   done
   echo $sum
}

test3() {
    
    
   newarrary=(`echo $@`)
   for ((i=0; i<=$[$# - 1]; i++))
   {
    
    
     newarrary[$i]=$[${newarrary[$i]} * 2]
   }
   echo ${
    
    newarrary[*]}
}

array=(3 2 1 4 5)
echo "原始数组的值为:${array[*]}"
result1=`test2 ${
    
    array[*]}`
echo "新数组的和为:$result1"

result2=(`test3 ${
    
    array[*]}`)
echo "新数组的值为:${result2[*]}"

数组排序算法

冒泡排序

类似气泡上涌的过程,会将元素在数组中从大到小或者从小到大不断地向前移动

  • 基本思想:
    冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换位置),这样较小的元素就像气泡一样从底部上升到顶部
  • 算法思路
    冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要再对比了,同时数组的排序已经完成了。而内部循环主要用于对比数组中每个响邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。
#!/bin/bash
array (63 4 24 1 3 15)

for ((i=1; i<${
    
    #array[*]}; i++))                 #比较轮数为数组长度减1,从1开始
do
  for ((j=0; j<${
    
    #array[*]}-i; j++))             #比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
  
  do
    if [ ${array[$j]} -gt ${
    
    array[$[$j+1]]}]     #如果第一个元素比第二个元素大就互换
    then
       temp=${
    
    array[$j]}                         #把第一个元素值保存到临时变量里面
       array[$j]=$[array[$[$j+1]]]               #把第二个元素值保存到第一个元素里面
       array[$[$j+1]]=$temp                      #把临时变量(也就是第一个元素原值)保存到第二个元素中
    fi
  done
done

echo ${
    
    array[*]}

直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会更快

  • 基本思想:
    将指定排序位置与其他数组元素分别做对比,如果满足条件就交换元素值,注意这里和冒泡排序不同,并不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序号的格式
#!/bin/bash
array=(63 4 24 1 3 15)
length=${
    
    #array[*]}
for ((i=1; i<$length; i++))
do
  index=0
  for ((j=1; j<=$length-i; j++))
  do
    if [ ${array[$j]} -gt ${
    
    array[$index]} ];then
       index=$j
    fi
    
  done
  temp=${
    
    array[$length-$i]}
  array[$length-$i]=${
    
    array[$index]}
  array[$index]=$temp
done

echo ${
    
    array[*]}

反转排序

以相反的顺序把原有数组的内容重新排序(只是与原排序相反,不会将内容按照顺序排序)

  • 基本思想:
    把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换
#!/bin/bash
array=(10 20 30 40 50 60)
length=${
    
    #array[*]}
for ((i=0; i<$length/2; i++))
do
  temp=${
    
    array[$i]}
  array[$i]=${
    
    array[$length-1-$i]}
  array[$length-1-$i]=$temp
done

echo ${
    
    array[*]}

猜你喜欢

转载自blog.csdn.net/Alterego_/article/details/111589746