写点什么

简单高效的 Shell 数组操作技巧与技术

  • 2023-04-17
    广东
  • 本文字数:1547 字

    阅读完需:约 5 分钟

Shell Array

数组是 Shell 脚本中一种常用的数据结构,用于存储一组数据。在 Shell 中,我们可以使用各种技巧来操作数组,包括数组的取值、移除数组中匹配的字符以及判断一个值是否在数组中。下面是一些常用的 Shell 数组操作技巧。

数组的初始化

使用空格分隔的元素初始化数组:

# 创建一个名为arrayZ的数组,其中包含了6个元素。arrayZ=( one two three four five five )
复制代码

使用冒号分隔的元素,并使用字符串替换进行数组初始化:

str="a:b:c:d:e"set -f # 避免通配符扩展(*的扩展)arr=(${str//:/ }) # 现在数组arr包含了值 'a', 'b', 'c', 'd', 'e'
复制代码

使用'tr'命令将冒号替换为换行符进行数组初始化

str="a:b:c:d:e"arr=($(echo $str | tr ':' "\n"))# 现在数组arr包含了值 'a', 'b', 'c', 'd', 'e'
复制代码

使用'sed'命令将冒号替换为换行符进行数组初始化:

str="a:b:c:d:e"arr=($(echo $str | sed 's/:/\n/g'))# 现在数组arr包含了值 'a', 'b', 'c', 'd', 'e'
复制代码

使用'IFS'(内部字段分隔符)和'eval'命令进行数组初始化:

str="a:b:c:d:e"IFS=':' eval 'arr=($str)'# 现在数组arr包含了值 'a', 'b', 'c', 'd', 'e'
复制代码

数组的访问

比如有如下一个数组: arrayZ=(one two three four five five)

使用 ${array[@]}或 ${array[*]}可以获取数组中的所有元素。

# 获取所有元素echo ${arrayZ[@]}   # 输出: one two three four five fiveecho ${arrayZ[*]}   # 输出: one two three four five five
复制代码

使用 ${array[@]:1}可以获取数组中从第二个元素开始的所有元素。

echo ${arrayZ[@]:1} //two three four five 
复制代码

使用 ${array[@]:2:3}可以获取数组中从第三个元素开始的三个元素。

# 获取从第三个元素开始的三个元素echo ${arrayZ[@]:2:3}   # 输出: three four five
复制代码

使用 ${#array[*]}或 ${#array[@]}可以获取数组中元素的个数。

# 获取数组中元素的个数echo ${#arrayZ[*]}   # 输出: 6echo ${#arrayZ[@]}   # 输出: 6
复制代码

使用 ${#array[0]}可以获取数组中第一个元素的长度。

# 获取第一个元素的长度echo ${#arrayZ[0]}   # 输出: 3
复制代码

数组的操作

使用 #和 ##、%和 %%操作符来移除数组中匹配的字符

# 最短匹配和最长匹配echo ${arrayZ[@]#f*r}  # 移除匹配"four"echo ${arrayZ[@]##t*e} # 最长匹配,移除匹配"three"
echo ${arrayZ[@]%h*e}  # 移除匹配"four"echo ${arrayZ[@]%%t*e} # 最长匹配,移除匹配"three"
复制代码

判断一个值是否在数组中

使用 grep 命令

arrayZ=( one two three four five five )
# 判断值是否在数组中echo ${arrayZ[@]:0} | grep -o '\bone\b' > /dev/nullif [ $? -eq 0 ]; then    echo "值在数组中"else    echo "值不在数组中"fi
复制代码

上面的示例中,${arrayZ[@]:0} 用于将数组展开为一个字符串,然后使用 grep 命令匹配值,并通过 -o 参数只输出匹配到的值。如果值在数组中,grep 命令会返回 0,否则返回非零值。通过判断 $? 的值,可以确定值是否在数组中。

使用自定义函数

containsElement () {    local e    for e in "${@:2}"; do        [[ "$e" == "$1" ]] && return 0    done    return 1}
# 判断值是否在数组中arrayZ=( one two three four five five )containsElement "onxxx" "${arrayZ[@]}"if [ $? -eq 0 ]; then    echo "值在数组中"else    echo "值不在数组中"fi
复制代码

上面的示例中,containsElement 函数接受两个参数,第一个参数是要判断的值,第二个参数是数组。函数通过遍历数组中的每个元素,比较是否与要判断的值相等,如果相等则返回 0,表示值在数组中;否则返回非零值,表示值不在数组中。

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2018-12-12 加入

还未添加个人简介

评论

发布
暂无评论
简单高效的Shell数组操作技巧与技术_linux命令_小毛驴的烂笔头_InfoQ写作社区