开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux Shell编程之四数组

简介:
+关注继续查看

什么是数组呢?

    在编程语言中,数组是具有相同数据类型变量的集合,在内存中存储在一段连续的空间里。在 Linux shell 中数组也是这么定义,但用法和使用格式具有自己的特点。

    下面从不同角度来解析数组。


一、数组的表示

    索引表示,一般使用数字做下标,从 0 开始:

例如:a[0],a[1],a[2]

    关联数组,数组的下标可以使用任意字符(符合变量命名的规则):

例如:a[/bin/bash],a[192.168.0.1]

    在 shell 中只支持一维数组,支持稀疏格式。


二、数组的定义

    declaer -a sum

    read -p "please input a array:"-a sum

    declare -A sum  # 定义关联数组,如果使用关联数组必须先定义


三、数组赋值

    一次只对一个赋值

a[0]=1,a[2]=$RANDOM

    一次对全部元素赋值,例如:

a=(red yellow black tigger mouse)

    按索引进行赋值

a=([1]=less [9]=more [10]=cat [8]=tail) # 稀疏格式存储

四、数组访问

    用索引访问,例如:

a[0] a[more]

    引用数组的值

${a[0]},${a[more]}

    全部引用:

${a[@]},${a[*]} 一般情况下使用 ${a[@]} 这种形式,具体使用格式区别如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@server array]# cat test\@.sh 
#!/bin/bash
for ((i=0;i < 5;i++));do
    a[$i]=$RANDOM
done
for loop in "${a[@]}";do
    echo $loop
done
for loop in "${a[*]}";do
    echo $loop
done
 
# ${a[@]} 这种形式列出所有的参数,每个参数是一个独立的字符串
# ${a[*]} 也是列出所有的参数,单数所有的参数是一个字符串
# 执行结果如下:
[root@server array]# ./test\@.sh 
32181
30658
26576
16071
6521
32181 30658 26576 16071 6521


五、数组的长度

    ${#a[*]},${#a[@]} 都可以表示数组的长度,在遍历数组时会使用到。

1
2
3
4
5
[root@server array]# a=(1 2 more less tail head)
[root@server array]# echo ${#a[@]}
6
[root@server array]# echo ${#a[*]}
6


6、从数组中挑选某元素:

    ${ARRAY[@]:offset:number}

        offset: 偏移的元素个数

        number: 取出的元素的个数

1
2
3
[root@server array]# a=(1 2 more less tail head)
[root@server array]# echo ${a[@]:1:2}
more

    ${ARRAY[@]:offset}:取出偏移量后的所有元素

1
2
[root@server array]# echo ${a[@]:2}
more less tail head

    ${ARRAY[@]}: 取出所有元素

1
2
[root@server array]# echo ${a[@]}
1 2 more less tail head


七、向数组追加元素和从数组中删除元素

    这里一般针对的是非关联数组,也就是使用数字作为下标的数组

    追加元素:

1
2
3
4
5
# 新追加的元素的下标是数组的长度
[root@server array]# a=(1 2 more less tail head)
[root@server array]# a[${#a[@]}]=33
[root@server array]# echo ${a[@]}
1 2 more less tail head 33

    删除数组中的元素,使用unset ARRAY[index]

1
2
3
[root@server array]# unset a[2]
[root@server array]# echo ${a[@]}
1 2 less tail head 33


八、数组的一些应用

1、复制一个数组中下标为偶数的元素至一个新数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
declare -a mylogs
logs=(/var/log/*.log)
 
echo ${logs[@]}
 
for in `seq 0 ${#logs[@]}`; do
    if [ $[$i%2] -eq 0 ];then
        index=${#mylogs[@]}
        mylogs[$index]=${logs[$i]}
    fi
done
 
echo ${mylogs[@]}
 
# 这里最关键的是这一句 index=${#mylogs[@]}
# 实现了新数组的下标的设定


2、统计 /etc/passwd 中使用各个shell的次数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
 
declare -A sum
     
while read line ;do
    index=`echo $line | cut -d: -f7`
    let sum[$index]++
done /etc/passwd
     
index_set=`cut -d: -f7 /etc/passwd sort uniq`
 
for loop in $index_set;do
    echo "$loop in /etc/passwd total have ${sum[$loop]} times."
done
 
# 这里主要是考察关联数组的应用。真正在实际中这种用法较多。

执行结果如下:

1
2
3
4
5
6
7
[root@server array]# ./sumbash.sh 
/bin/bash in /etc/passwd total have 56 times.
/bin/sync in /etc/passwd total have 1 times.
/bin/tcsh in /etc/passwd total have 1 times.
/sbin/halt in /etc/passwd total have 1 times.
/sbin/nologin in /etc/passwd total have 33 times.
/sbin/shutdown in /etc/passwd total have 1 times.


2、将 10 个随机数按升序排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
 
for in {0..9};do
    arr[$i]=$RANDOM
done
 
echo "${arr[@]}"
 
let -i tmp
 
for in `seq 0 $[${#arr[@]}-1]`;do
    for in `seq $[$i+1] $[${#arr[@]}-1]` ;do
        if [  ${arr[$j]} -lt ${arr[$i]} ];then
            tmp=${arr[$j]}
            arr[$j]=${arr[$i]}
            arr[$i]=$tmp
        fi 
    done
done
 
echo "${arr[@]}"
 
# 这个示例只在说明数组的使用形式,shell 中的数组一般不进行这样的工作。

执行结果:

1
2
3
[root@server array]# ./sort.sh 
749 18853 896 20690 4794 395 23231 24049 4906 21630
395 749 896 4794 4906 18853 20690 21630 23231 24049

    至此,数组的基本使用就介绍完毕。










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1534111,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Shell编程基入门
Shell编程基入门
601 0
Shell编程入门(第二版)(下)
流程控制语句 三、select/in[较少用] 格式: [python] view plaincopy     select [变量] in [关键字]       do            command 1            .
896 0
Shell编程入门(第二版)(中)
变量测试语句-test 作用:用来测试变量是否相等,是否为空,文件类型等。 格式: test 测试条件 或 [] #范围:整数,字符串,文件     1)整数测试:  test int...
822 0
Shell编程入门(第二版)(上)
简单的示例Shell程序 示例1. #!/bin/bash #This is to show what a shell script looks like echo "Our first e...
612 0
shell脚本中获取本机ip地址的方法
ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}') echo $ipaddr
1111 0
Shell脚本中执行sql语句操作mysql的5种方法
Shell脚本中执行sql语句操作mysql的5种方法 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本。
5040 0
Shell脚本生成网页版相册浏览器
今天学到了一招,那就是使用脚本制作一款网页版相册浏览器。先上图吧。 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget 图片处理工具: ImageMagicK, 解压缩工具 : rar ,bzip都行 额外技能:一些基本的Linux操作命令,如此即可。
1000 0
[Shell]获取当前正在执行脚本的绝对路径
1. pwd命令 我们看看使用pwd命令能否获取当前正在执行脚本的绝对路径。该命令的作用是“print name of current/working directory”,真实含义是当前工作目录,并不是正在执行脚本的目录。
882 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Shell 脚本速查手册
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
《使用Serverless服务快速开发小程序》
立即下载