前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bash处理数组系列函数

Bash处理数组系列函数

原创
作者头像
程序员小涛
修改2021-02-23 18:02:46
4220
修改2021-02-23 18:02:46
举报
文章被收录于专栏:涛的程序人生涛的程序人生

@TOC

反转数组

启用extdebug允许访问BASH_ARGV数组,该数组反向存储当前函数的参数。

警告: 需要 bash 5.0+ 的 shopt -s compat44

示例函数:

代码语言:txt
复制
reverse_array() {
    # Usage: reverse_array "array"
    shopt -s extdebug
    f()(printf '%s\n' "${BASH_ARGV[@]}"); f "$@"
    shopt -u extdebug
}

示例用法:

代码语言:txt
复制
$ reverse_array 1 2 3 4 5
5
4
3
2
1

$ arr=(red blue green)
$ reverse_array "${arr[@]}"
green
blue
red

删除重复的数组元素

创建临时关联数组。当设置关联数组值并发生重复赋值时,bash将覆盖该键。

这使我们能够有效地删除重复的数组。

警告: 需要 bash 4+

警告: 列表顺序可能不一样。

示例函数:

代码语言:txt
复制
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[@]}"
}

示例用法:

代码语言:txt
复制
$ remove_array_dups 1 1 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5
1
2
3
4
5

$ arr=(red red green blue blue)
$ remove_array_dups "${arr[@]}"
red
green
blue

随机数组元素

示例函数:

代码语言:txt
复制
random_array_element() {
    # Usage: random_array_element "array"
    local arr=("$@")
    printf '%s\n' "${arr[RANDOM % $#]}"
}

示例用法:

代码语言:txt
复制
$ array=(red green blue yellow brown)
$ random_array_element "${array[@]}"
yellow

# Multiple arguments can also be passed.
$ random_array_element 1 2 3 4 5 6 7
3

在数组中循环

每次调用 printf 时,都会打印下一个数组元素。当打印命中最后一个数组元素时,它会再次从第一个元素开始。

代码语言:txt
复制
arr=(a b c d)

cycle() {
    printf '%s ' "${arr[${i:=0}]}"
    ((i=i>=${#arr[@]}-1?0:++i))
}

在两个值之间切换

这与上面的工作原理相同,这只是一个不同的用例。

代码语言:txt
复制
arr=(true false)

cycle() {
    printf '%s ' "${arr[${i:=0}]}"
    ((i=i>=${#arr[@]}-1?0:++i))
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反转数组
  • 删除重复的数组元素
  • 随机数组元素
  • 在数组中循环
  • 在两个值之间切换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档