Shell编程基础(第2篇:数组)

前言

    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增加了类似字典的关联数组,以后单开一篇文章介绍

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值