Linux shell编程 数组

news/2024/11/20 0:30:15/

数组定义

数组内数据类型可以为数值也可以为字符串。

若字符串类型需要使用 ' '    " " 包含以免空格扰乱数组。

方法1

空格分隔直接定义数组

arr=(10 20 30 40 50)
arr1=('zhangsan' 'lisi' 'wangwu')

方法2

 指定元素下标定义,若跳过元素不设置会显示为空

arr=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50)

方法3

 字符串左右加上( )转换为数组

str="10 20 30"
arr=($list)

方法4

指定元素下标定义,若跳过元素不设置会显示为空

arr[0]=10
arr[1]=20
arr[2]=30

FOR循环快速定义数组

a=0 #下标
for i in 10 20 30 40 50
doarray[$a]=$ilet a++
doneecho ${array[*]}

数组输出

数组的输出不能像变量一样 echo $array ,这样只能输出第一个元素。

echo ${array[*]}
echo ${array[@]}

 配合awk命令获取列表最后一个元素

echo ${array[*]} | awk '{print $NF}' #输出所有数组内容 $NF筛选最后一个元素
#赋值给变量
last=$( echo ${array[*]} | awk '{print $NF}' )

数组长度统计

echo ${#array[*]}
echo ${#array[@]}

 若数组中有下标被跳过没有赋值,统计的长度(有值的下标)会与数组总长度不相同!

[xue@xue ~]$ arr1=([0]=10 [1]=20 [2]=30 [3]=40 [4]=50)
[xue@xue ~]$ echo ${#arr1[*]}
5[xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50)
[xue@xue ~]$ echo ${#arr[*]}
4

显示有值的数组下标

echo ${!array[*]}
echo ${!array[@]}
[xue@xue ~]$ arr=([0]=10 [1]=20 [2]=30 [4]=50)
[xue@xue ~]$ echo ${!arr[*]}
0 1 2 4

获取最后一个下标

array=(10 20 30 40 50)#使用分片通配符方式
xiabiao=${!array[*]} #获取全部下标
echo ${xiabiao##* } #从前向后删到剩最后一个下标#也可以使用AWK获取最后一段的方式
echo ${!array[*]} | awk '{print $NF}'

根据下标获取元素值

echo ${array[0]}
echo ${array[1]}
echo ${array[2]}

数组遍历

for i in ${array[*]}
doecho $i
done

数组切片

${arr[@]:下标:长度}    数组切片,获取从数组的某个下标开始的多少个元素
[xue@xue ~]$ array=(a b c d e 1 2 3 4 5)
[xue@xue ~]$ echo ${array[*]:6:3}
2 3 4

数组替换

${arr[*]/旧字符/新字符}  arr= ( ${arr[*]/旧字符/新字符} )  
#重新赋值,写入变量

注意 替换会将所有匹配到的字符都替换掉

并且替换不会对变量重新赋值,只有将替换后的结果重新赋值给变量才能改变变量值

[xue@xue ~]$ array=(10 50 100 150 1000)
[xue@xue ~]$ echo ${array[*]/10/666}  
666 50 6660 150 66600 array= ( ${array[*]/10/666} )  #重新赋值,写入变量

删除数组

unset  array          #删除数组
unset  array[1]    #删除数组下标为1的元素

数组追加元素

方法1

设置指定下标的值

arr[ 下标 ] = 值
arr[ 1 ] = 20

方法2

 直接用数组长度作为下标,表示在尾部追加

arr[ 数组长度 ] = 值
arr[ ${#arr[*]} ] = 20

方法3

最简单的方法 arr += 10

arr += (值1 值2 ...)
arr += (60 70 80 90 100)

方法4

直接重新定义数组,使用数组原先的值加上需要添加的值

双引号不能省略!

否则在数组arr中带空格的元素(“zhang san”)会被拆分成(“zhang” “san”)

不能将 @ 替换为 * !
${array[*]} ${array[@]}在未加双引号时同义,都表示所有元素
但加双引号时, arr=("${arr[
*]}") 会将数组所有元素视为同一个元素添加进数组中

arr=("${arr[@]}" "值1" "值2" ...)
arr=("${arr[@]}" "100" "200" ...) 

向函数传入数组

如果数组变量作为函数参数直接传参,函数只会得到数组第一个值(t1

解决这个问题可以将数组变量值分解为单个的值,然后将这些值作为函数使用。在函数内部,再组合成一个新的数组变量。

  1. ${array[@]}               拆分为单个值
  2. ( $@ )       (`echo $@`)       $(echo $@)  将传来的值用括号重新组合数组
t1 () {echo "t1接收到的参数列表:$@ "newarray1=($@)  #传参方法1 直接用括号包含传来的单个元素重新组成数组echo "t1新数组的值 ${newarray1[@]} "
}t2 () { #传参方法2 (`echo $@`) 或$(echo $@)得到echo执行的结果再用括号包含重新组成数组echo "t2接收到的参数列表:$@ "newarray2=($(echo $@))  echo "t2新数组的值 ${newarray2[@]} "
}array=(10 20 30 40 50)
echo "原始数组为 ${array[@]}"#直接传参 数组 只能得到第一个数据
t1 $array
t2 $array 
#分解成单个值重新组合 正常显示
t1 ${array[@]}
t2 ${array[@]} 
[xue@xue ~]$ sh 12.sh原始数组为 10 20 30 40 50t1接收到的参数列表:10
t1新数组的值 10
t2接收到的参数列表:10
t2新数组的值 10t1接收到的参数列表:10 20 30 40 50
t1新数组的值 10 20 30 40 50
t2接收到的参数列表:10 20 30 40 50
t2新数组的值 10 20 30 40 50

向函数传入数组并从函数返回数组

  1. ${array[@]}            拆分为单个值
  2. newarray=(`echo $@`)  、newarray=( $@) 、newarray=($(echo $@)) 传参进去重新组合
  3. echo ${newarray[*]}     传参出来

result1 = ( `  函数名  ${array[*]}  ` )  执行结果给参数赋值

t1 () {newarray=(`echo $@`) #重新拼接sum=0for value in ${newarray[*]} #求和dosum=$[$sum + $value]doneecho $sum
}t2 () {newarray=(`echo $@`)for ((i=0;i<=$[$# -1 ];i++)) #下标从0开始,比计数少1 {newarray[$i]=$[${newarray[$i]} *2 ] #x2}echo ${newarray[*]}
}array=(10 20 30 40 50)
echo "原始数组为 ${array[@]}"result1=(`t1 ${array[*]}`)
result2=(`t2 ${array[*]}`)
echo "新数组的和为 $result1 "
echo "新数组的值为 ${result2[*]} "
[xue@xue ~]$ sh 115.sh
原始数组为 10 20 30 40 50
新数组的和为 150
新数组的值为 20 40 60 80 100


http://www.ppmy.cn/news/66820.html

相关文章

C++笔记—— 第十七篇 智能指针 C++11来了(下)

目录 1. 为什么需要智能指针 2. 内存泄漏 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2 内存泄漏分类 2.3如何避免内存泄漏 3.智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr shared_ptr的线…

每周一算法:差分算法

差分算法 差分是一种常见的算法&#xff0c;用于快速修改数组中某一段区间的值。其基本思想就是预处理出数组的差分数组&#xff0c;然后修改区间时&#xff0c;只需要修改两个位置的值&#xff0c;即可快速完成区间修改。最后再通过差分数组求出原数组。差分算法在区间加、区…

小米刷机小白教程最新详细版

★本篇为线刷&#xff08;以修补boot的方式刷入面具&#xff09; 如果你用的是小米手机&#xff0c;想获取面具root&#xff0c;看这一篇就够了&#xff0c;即使你是小白 必应搜索醉里博客http://202271.xyz?xiaomi 原创不易&#xff0c;谢绝转载&#xff0c;如果本教程有帮…

git 解决 “fatal: Could not read from remote repository.“

现象 在使用Git将本地仓库推送到远程仓库的时候&#xff0c;发生了如下错误&#xff1a;“fatal: Could not read from remote repository.” 原因 出现这错误一般是以下两种原因&#xff1a; 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 为解决以上问题&a…

【AI大模型智慧办公】用《文心一言》1分钟写一篇博客简直yyds

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会&#xff0c;博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来&#xff0c;让更多人了解自己。通过写博客&a…

BRC20科普——关于Brc20的相关问题

统一回答下新人最近遇到的问题&#xff01; 1&#xff0c;brc20的铭文与代币什么关系&#xff1f; 答&#xff1a; 铭文相当于一个袋子&#xff0c;里面装着Token。 每个brc20Token的铸造都有指定的名字与固定数量&#xff0c;例如odri&#xff08;Token名称&#xff09;&am…

Figma中文网?比Figma更懂你的设计网站!

一个比 Figma 更懂你的设计网站的 Figma 中文网 —— 即时设计是一个非常有用的设计资源平台&#xff0c;它提供了大量的免费设计素材&#xff0c;包括来自各大厂商的 UI 组件库、精美的模板、插画设计和矢量图标素材等等。设计师可以从中学习到大师的设计技巧和规范&#xff0…

环评制图丨最新导则下的生态系统、土地利用、植被覆盖、适宜生境分布图等制图

根据最新生态环境影响评价导则&#xff0c;结合生态环评内容庞杂、综合性强的特点&#xff0c;以既包括陆域、又包括水域的项目为主要案例&#xff0c;对生态环评的具体流程及所需内容进行系统阐述。利用Rstudio、Fragstats等软件分析计算生态环评中所需各种指数&#xff0c;利…