前言
shell编程中的数组用于保存多个元素,数组操作的那些功能,它都有:创建数组、添加元素、修改元素、读取元素、删除元素、遍历数组。
shell编程提供的数据结构非常少,数组是最常用的数据结构,所以大家一定好好学习数组!
创建数组的9个方式
你没有看错,创建方式真的不止9种方式,我也是服了shell标准了!
1、最常用方式,元素之间使用空格字符分隔,每个元素直接放在括号里
创建的是3个元素的数组
first=(one two three)
2、元素之间使用换行符分隔,也放在括号里
包括3个元素的数组
second=(
one
two
three
)
3、直接通过下标赋值,第一个元素的下标从0开始
同样创建的是3个元素的数组
third[0]=one
third[1]=two
third[2]=three
4、每个元素前指定下标位置,下标值顺序可以任意指定,还放在括号里
fourth=([1]=two [0]=one [2]=three)
5、混合创建方式,只有下标0、下标5存在元素,其它下标默认为空
fifth=(hello [5]=world)
6、利用文件名替换,*表示文件名替换,文件名替换后的结果,由于使用空格字符隔开,所以bash解释器利用其特点,符合数组的创建规范,刚好组合成数组中的元素!
注意:bash解释器看到*时,会首先在当前工作目录下进行文件名替换,返回的各个文件名又以空格字符隔开,符合数组的创建规范
sixth=(*.mp3)
7、使用declare命令创建,数组名为seventh
declare -a seventh
8、利用变量值替换,由于变量值替换会先执行,且是由空格字符隔开的元素,也同样符合shell数组的规范
注意:bash解释器会先执行变量值替换,由于值中间包含空格字符,符合数组的规范,正好组成数组的元素
temp="one two three"
eighth=(${temp})
由于变量值替换先被执行,所以替换后是这个样子的,空格字符天生用于隔开数组中的元素,符合数组规范
eighth=(one two three)
9、利用命令替换,返回的标准输出由于有换行字符,此时自动组合进数组里
注意:命令替换也会被bash解释器优先执行,替换后的结果,正好符合数组的规范
my_array=($(ls))
echo ${my_array[0]}
创建数组的总结:只要符合空白字符去隔开元素:空格、换行、制表符、或者混合,只要的空白字符隔开即可创建数组!!!!!!!!!!!!!!!!!!!!!!!记住了!!!!好灵活
比如:以下由制表符、换行符、空白字符组成的数组,1和4之间使用制表符、4和5之间使用换行符、5和6之间使用空格字符)
注意:制表符一般不容易打出来,空格字符和换行符作为数组的分隔是最常见的
a=(1 4
5 6)
添加元素
1、未指定下标添加元素,直接使用数组名添加元素,新元素为第一个元素(注意:如果存在,会被替换,数组名等同于下标0)
demo=([1]=wc)
demo=wang # 等同于 demo[0]=wang
echo ${demo[@]}
输出:
wang wc
2、指定下标添加元素
demo[10]=wc
3、数组末尾添加多个元素,使用+=
my=(wang yuan wai)
my+=(a b c)
echo ${my[@]}
删除元素
1、删除单个元素
my=(wang yuan wai)
unset $my[1]
2、删除整个数组
my=(wang yuan wai)
unset my
修改元素
1、指定下标修改,元素存在,即为修改
my=(wang yuan wai)
my[1]=haha
2、修改第一个元素的两种方式
my=baby
my[0]=baby
查找元素(访问)
1、查找单个元素值
第一个元素的下标是0
my=(wang yuan wai)
echo ${my[0]}
2、查找所有元素,使用*
my=(wang yuan wai)
echo ${my[*]}
3、查找所有元素,使用@(建议)
my=(wang yuan wai)
echo ${my[@]}
查找全部元素时*与@的区别?
1、for in的后面没有双引号修饰,无区别
my=("baby first" "the man")
for i in ${my[*]}; do
echo $i
done
for i in ${my[@]}; do
echo $i
done
输出:
baby
first
the
man
2、for in后面使用双引号修饰,*作为整体(由于单词分隔功能无效,for in后面的list,同样依赖空白字符,双引号内的空格字符已失效),@按照每个元素分隔
my=("baby first" "the man")
*访问全部元素
for i in "${my[*]}"; do
echo $i
done
输出:
baby first the man
此时对于for in,它看到的是"baby first the man"
@访问全部元素(@会强制让单词分隔功能仍然有效,这点作者设计的很坑爹)
for i in "${my[@]}"; do
echo $i
done
输出:
baby first
the man
此时对于for in,它看到的是"baby first" "the man"
通用
1、元素个数的获取(数组长度)
my=(wang yuan wai)
echo ${#my[@]}
语法另类……
2、查看数组某个元素(字符串)的长度
my=(wang yuan wai)
echo ${#my[0]}
3、查看已赋值元素的下标
my=([0]=wang [50]=yuanwai [100]=wai)
echo ${!my[*]}
echo ${!my[@]}
总结
1、bash的数组没有空余元素,举例:my[100]=wang,其中0-99位置并不会创建空余元素
2、遍历元素,建议使用for循环与${my[@]}
3、直接赋值一个数组为空,无法清空数组,举例:my=(wang yuan wai); my=;
4、还有一种declare创建数组的方式,举例:declare -a my_array
5、数组是你使用率最高的数据结构了,它创建方式的灵活性让你一定爽歪歪
6、现在bash增加了类似字典的关联数组,以后单开一篇文章介绍