数组的用法


# 数组是相同数据类型的元素按顺序排列的集合,把有限个类型相同的变量用一个名字命名后用编号区分
# 集合名称为数组名,编号称为下标,下标默认从 0 开始,组成数组的各个变量称为数组的元素
# 数组是在程序设计中为了处理方便,把相同类型的若干变量按有序的形式组织起来的形式

# 声明下标数组
declare -a array1
declare -a array2=( element1 element2 element3 ...)
array3=(
value1
value2
value3
...
)

# 声明关联数组
declare -A array
array[0]=one ; array[1]=two ; ...
array=(
[1]=one
[2]=two
[3]=three
...
)

# 使用命令的输出内容作为数组元素
array=($(ls -1 $HOME))

# —————————————————————————————————————————————————————————————————————————————————————————— 模拟 Maps
#!/bin/bash

declare -A maps=(
["a"]="
value1
value2
"
["b"]="
value3
value4
"
)

for key in ${!maps[@]}
{
    for value in ${maps[$key]}
    {
        echo K:$key V:$value
    }
}

# K:a V:value1
# K:a V:value2
# K:b V:value3
# K:b V:value4

# —————————————————————————————————————————————————————————————————————————————————————————— Array

${array[@]}                     # 数组元素展开
${array[*]}                     # 数组元素(字符串形式)
${!array[@]}                    # 显示所有的键(数组下标展开)
${#array[@]}                    # 数组元素个数
${#array[$index]}               # 特定元素长度
${array[@]:1}                   # 从第 1 个元素到最后
${array[@]:0:2}                 # 从第 0 个元素到第 2 个索引的元素 echo ${arry[@]:offset:number}
${array[@]#t*e}                 # 从左向右删除第一个匹配 t*e 的元素
${array[@]##t*e}                # 从左向右删除所有的匹配 t*e 的元素
${array[@]%t*e}                 # 从右向左删除第一个匹配 t*e 的元素
${array[@]%%t*e}                # 从右向左删除所有的匹配 t*e 的元素
${array[@]/x/y}                 # 替换第一个 x 字符为 y
${array[@]//x/y}                # 替换所有的 x 字符为 y
${array[@]//x/}                 # 当未指定替换的文本值时,其默认动作为删除
${array[@]/#x/y}                # 从左向右替换第一个 x 为 y
${array[@]/%x/y}                # 从右向左替换第一个 x 为 y
unset ${arry}                   # 删除数组
unset ${arry[$index]}           # 删除数组元素
arry[$index]=$((RANDOM%50+1))   # 为指定元素赋值指定范围的随机数
read -a arry                    # 交互式读入数组

# 复制数组
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Linux=("${Unix[@]}")

# 关联数组引用变量值
declare -A maps 
value=123
ref=value
maps=([a]=1 [b]=$ref [c]=2) 
echo ${test[b]}     # value
echo ${!test[b]}    # 123
value=666
echo ${!test[b]}    # 666

# —————————————————————————————————————————————————————————————————————————————————————————— 数组元素比较

a=(1 2 3 4)
b=(4 5 6 7)
for((i=0;i<=${#a[@]};i++))
{
    n1='${a['$i']}'
    n2='${b['$i']}' 
    eval "cmp1=$n1 ; cmp2=$n2"
    (( cmp1 < cmp2 )) && echo "a[$i] < b[$i]"
}
# a[0] < b[0]
# a[1] < b[1]
# a[2] < b[2]
# a[3] < b[3]

# —————————————————————————————————————————————————————————————————————————————————————————— 遍历数组

for((i=0;i<${#array[@]};i++))
{
    echo ${array[i]}
}

# 或
for i in ${array[@]}
{
    echo $i
}

# 或
i=0
while [ $i -lt ${#array[@]} ]  
do
    echo ${array[$i]}  
    let i++  
done

求多维数组中的最大、最小值


cat <<EOF > numberfile
33   55   23   56   99
234  234  545  6546 34
11   43   534  33   75
43   34   76   756  33
343  890  77   667  55
EOF
# —————————————————————————————————————————————————————————————————————————————————————————— 
#!/bin/bash
max=0
min=999999
line=1
dnum=$(cat numberfile | wc -l)

while (($line<=$dnum))
do
    for i in $(cat numberfile | head -$line)
    do
        ((max<$i)) && max=$i
        ((min>$i)) && min=$i
    done
    let ++line
done

echo "max number: $max"
echo "min number: $min"

# 或
echo "MAX: $(cat numberfile | awk '{for(i=1;i<=NF;i++)if(max<$i){max=$i};print max}'| tail -1)"
echo "MIN: $(cat numberfile | awk '{min=999999;for(i=1;i<=NF;i++)if(min>$i){min=$i};print min }'| tail -1)

模拟字典结构


hput() {
    eval "hkey_$1"="$2"
}

hget() {
    eval echo '${'"hkey_$1"'}'
}

hput k1 aaa     # 设置字典的 KEY VALUE
hget k1         # 获取字典的 KEY 值
# aaa