シェルプログラミング配列とバブルアルゴリズムソートの詳細な説明

配列の4つの式

方法1:
配列名=(value0 value1 value2…)
方法2:
配列名=([0] = value [1] = value [2] = value)
方法3:
リストname = "value0 value1 value2…"
配列名= ($ list name)
方法4:
配列名[0] = "value"
配列名[1] = "value"
配列名[2] = "value"
……

2つのアレイの追加、削除、変更、動作確認

配列の長さを取得する
arr_length = $ {#arr_number [*]}
配列スライス

[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]}  		//输出整个数组
1 2 3 4 5
[root@localhost ~]# echo ${a[@]:0:2}  #${数组名[@或*]:起始位置:长度]
1 2 
[root@localhost ~]# echo ${a[@]:2:3}
3 4 5
注意:将数组切片之后,返回的是字符串,以空格作为分隔符

アレイの交換

arr=(1 2 3 4 5)
echo ${arr[@]/4/66}  //${数组名[@或*]/查找字符/替换字符}
1 2 3 66 5
echo ${arr[@]}       //并不会替换数组原有内容
1 2 3 4 5
a=(${arr[@]/4/66})		//要实现改变原有数组,可通过重新赋值实现
echo ${arr[*]}
1 2 3 66 5

配列を削除

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# unset arr		//删除整个数组

[root@localhost ~]# unset arr[2]		//删除第三个元素
[root@localhost ~]# echo ${arr[*]}
1 2 4 5

配列に要素を追加

方法1 array_name[index]=value
方法2 array_name[${#array_name[@]}]=value
方法3 array_name=("${array_name[@]}" value1 ... valueN)
方法4 array_name+=(value1 value 2 ... valueN)

ここに画像の説明を挿入

注意:
「$ {array_name [@]}」内の二重引用符は省略できません。それ以外の場合、配列array_nameに
スペースを含む要素が出現すると、要素はスペースによって複数に分割されます

@を*で置き換えることはできません。それ以外の場合は、二重引用符を追加すると、配列array_nameのすべての要素が1つの要素として配列に追加されます。
ここに画像の説明を挿入

パラメーターの3つのグループ

3.1メインプログラムが配列パラメーターを関数に渡す

関数で配列を呼び出すと、次の問題が発生する可能性があります

#!/bin/bash
test1() {
    
    
echo "函数接收到的列表为:$@"
newarray=$1
echo ${newarray[*]}
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test1 $array

演算の結果を下の図に示します。
ここに画像の説明を挿入
このとき、配列変数の値を個々の値に分解し、これらの値を関数パラメーターとして使用する必要があります。関数内では、すべてのパラメーターが新しい配列変数に再結合されます。
デモコードは次のとおりです。

#!/bin/bash
test2() {
    
    
newarray=($(echo $@))		//$@会把接收到的所有的位置参数都表示出来,并且分割成单个元素。此处也可以写成newarray=($@)
echo "新数组的值为:${newarray[*]}"
}
array=(3 2 1 4 5)
echo "原始的数组值为${array[*]}"
test2 ${array[*]}		//此处{
    
    }必加,表示把这个数组看作一个整体

結果は以下の通りです
ここに画像の説明を挿入

3.2関数からメインプログラムに配列を返す

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

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

4つのバブルアルゴリズムの並べ替え

バブルのソートは
、上昇するバブルの動作に似ており、配列内のデータを小さいものから大きいものへ、または大きいものから小さいものへと移動します。

基本的な考え方:
バブルの並べ替えの基本的な考え方は、2つの隣接する要素の値を比較し、条件が満たされた場合に要素の値を交換し、小さい方の要素を配列の後ろに移動(つまり、2つの要素の位置を交換)して、それを小さくします要素は泡のように下から上に上昇します。

アルゴリズムの考え方
バブルアルゴリズムは、外側のループを使用して並べ替えの回数を制御する二重層ループによって実装されます。最後のループには配列要素が1つしか残っていないため、比較が不要であり、配列が完成しているため、通常、並べ替えられた配列の長さは1つ短くなります。整理されました。内部ループは主に、配列内の隣接する各要素のサイズを比較して、位置を交換するかどうかを決定するために使用されます。

コード

#!/bin/bash
paixu() {
    
    
array=($1)
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[*]}
}
#主体代码
f=$(cat $1)
paixu $f

結果は以下の通りです
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/cenjeal/article/details/108128512