当前位置:首页 > 技术分析 > 正文内容

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

ruisui881个月前 (05-18)技术分析12

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 five
echo ${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[*]}   # 输出: 6
echo ${#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/null
if [ $? -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,表示值在数组中;否则返回非零值,表示值不在数组中。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4136.html

标签: 截取数组
分享给朋友:

“简单高效的Shell数组操作技巧与技术” 的相关文章

Windows 下 Git 拉 Gitlab 代码

读者提问:『阿常你好,Windows 下 Git 拉 Gitlab 代码的操作步骤可以分享一下吗?』阿常回答:好的,总共分为五个步骤。一、Windows 下安装 Git官网下载链接:https://git-scm.com/download/winStandalone Installer(安装版)注意...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令![送心]git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!# 按顺序执行 git config --global user.name "自己的账号" git config -...

国产操作系统上Vim的详解03--安装和使用插件 | 统信 | 麒麟 | 中科方德

原文链接:国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 | 统信 | 麒麟 | 中科方德Hello,大家好啊!今天给大家带来一篇在国产操作系统上使用Vundle插件管理器来安装和使用Vim插件的详解文章。Vundle是Vim的一款强大的插件管理器,可以帮助我们轻松地安...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...