Skip to content

Latest commit

 

History

History
132 lines (86 loc) · 2.73 KB

删除重复的数组元素.md

File metadata and controls

132 lines (86 loc) · 2.73 KB

删除重复的数组元素

# 删除重复的数组元素
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
	}