1 Star 9 Fork 6

bingios / pure-bash-bible-zh_CN

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
删除重复的数组元素.md 2.65 KB
一键复制 编辑 原始数据 按行查看 历史
阿笨猫 提交于 2019-08-24 22:07 . first commit

删除重复的数组元素

# 删除重复的数组元素
remove_array_dups() {
    # Usage: remove_array_dups "array"
    declare -A tmp_array

    for i in "$@"; do
        [[ $i ]] && IFS=" " tmp_array["${i:- }"]=1
    done

    printf '%s\n' "${!tmp_array[@]}"
}

语法说明:

declare -A tmp_array

  • 声明语句将一个变量声明为关联数组;

tmp_array["${i:- }"]=1

  • `"${i:- }" 如果i为空则返回空格,如果i不为空,则返回i;
  • tmp_array["$i"]=1 将关联数组以i作下标的值赋为1,如果之前已经存在,则会重复赋值,变相的过滤了重复元素。

${!tmp_array[@]}

  • 使用${!数组名[@或者*]}获取数组的索引列表

bash中的关联数组

  • Bash从4.0的版本开始就可以使用关联数组了

  • 关联数组的下标可以采用非整型类型,类似于其他语言中的字典key-value类型,其中,key为下标,value为对应的元素的值,key唯一,value可以不唯一。

  • 使用关联数组前应该先声明 declare -A array

关联数组用法如下:

array["jim"]=158
array["amy"]=168

或者直接使用内嵌“索引-值”列表法:

array=(["jim"]=158 ["amy"]=168)

遍历array:

for key in ${!array[*]}
do
    echo $key
done

使用下标遍历array:

for i in "${!array[@]}"
do
    echo ${array[$i]}
done

其他语法如下:

echo ${!array[*]}   #取关联数组所有键
echo ${!array[@]}  #取关联数组所有键
echo ${array[*]}       #取关联数组所有值
echo ${array[@]}      #取关联数组所有值
echo ${#array[*]}  #取关联数组长度
echo ${#array[@]} #取关联数组长度
  • 在为关联数组赋值时,不加"$",而是直接 array["fe"]=189 ,在取值的时候,要加"$",如 $array["fe"] 则得到的是189

  • 清空数组元素 unset array[“fe”] ,但是这样清空后,array中仍有“fe”这个key,只是其对应的值被清空了

  • 清空整个数组 unset array,但是这样清空后,array的key是没有了,但是整个array也不能再用了,如下所示:

    declare -A array array["jim"]=158 unset array array["jim"]=189

    则会出错:语法错误,也就是在unset array之后,该array不再是关联数组,所以key不可以用非整型来做索引

  • 判断某一个key是否在该关联数组中,如下所示:

    function isInCountResult(){ for key in ${!count_result[*]} do if [ "$1" = "$key" ] then return 0 fi done return 1 }

其他
1
https://gitee.com/bingios/pure-bash-bible-zh_CN.git
git@gitee.com:bingios/pure-bash-bible-zh_CN.git
bingios
pure-bash-bible-zh_CN
pure-bash-bible-zh_CN
master

搜索帮助