シェルプログラミング配列とバブルアルゴリズムソートの詳細な説明
配列の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
結果は以下の通りです