本文主要讲解Shell脚本开发中数组的知识与实践

目录:

1.Shell数组介绍

2.Shell数组的定义与常用实践

3.Shell数组脚本开发实践

4.shell数组的重要命令

5.Shell数组相关面试题实战


一:Shell数组介绍

1)Shell数组产生的缘由

通常在开发shell脚本时,定义变量采用的形式为"a=1;b=2;c=3",可如果有多个变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生了,它就是为了解决上诉问题而出现的。

2)什么是Shell数组

简单地说,Shell数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。

有了Shell数组之后,就可以用相同名字来引用一系列变量及变量值了,并通过数字(索引)来识别使用它们。在很多场合中,使用数组可以缩短和简化程序开发。


二:Shell数组的定义与增删改查

1)Shell数组的定义的多种方法

法1:用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格进行分割。

语法如下:

array=(value1 value2 value3 ...)
示例如下:
[root@aliyun shuzu]# array=(1 2 3)
[root@aliyun shuzu]# echo ${array[*]}
1 2 3
#最常见的定义数组方法

法2:用小括号将变量值括起来,同时采用键值对的形式赋值。

语法如下:

array=([1]=one [2]=tow [3]=three)
示例如下:
[root@aliyun shuzu]# array=([1]=one [2]=tow [3]=three)
[root@aliyun shuzu]# echo ${array[*]}
one tow three
[root@aliyun shuzu]# echo ${array[1]}
one
[root@aliyun shuzu]# echo ${array[2]}
tow
#此法比较复杂,不推荐使用

法3:通过分别定义数组变量的方法来定义。

语法如下:

array[0]=a;array[1]=b,array[2]=c
示例如下:
[root@aliyun shuzu]# array[0]=a
[root@aliyun shuzu]# array[1]=b
[root@aliyun shuzu]# array[2]=c
[root@aliyun shuzu]# echo ${array[0]}
a
[root@aliyun shuzu]# echo ${array[1]}
b
[root@aliyun shuzu]# echo ${array[2]}
c
#此法比较复杂,不推荐使用

法4:动态地定义数组变量,并使用命令的输出结果作为数组的内容。

array=($(命令))  或  array=(`命令`)
示例如下:
[root@aliyun shuzu]# touch ywxi{1..3}.txt
[root@aliyun shuzu]# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi1.txt
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi2.txt
-rw-r--r-- 1 root root 0 Jun  9 04:03 ywxi3.txt
[root@aliyun shuzu]# array=($(ls))
[root@aliyun shuzu]# echo ${array[*]}
ywxi1.txt ywxi2.txt ywxi3.txt
[root@aliyun shuzu]# array=(`ls`)
[root@aliyun shuzu]# echo ${array[*]}
ywxi1.txt ywxi2.txt ywxi3.txt
#此法经常被使用

2)Shell数组的定义与常用实践

1.打印数组元素

示例如下:

[root@aliyun shuzu]# array=(one two three)
[root@aliyun shuzu]# echo ${array[0]}
one
[root@aliyun shuzu]# echo ${array[1]}
two
[root@aliyun shuzu]# echo ${array[*]}
one two three
[root@aliyun shuzu]# echo ${array[@]}
one two three

2.打印数组元素的个数

示例如下:

[root@aliyun shuzu]# echo ${array[*]}
one two three
[root@aliyun shuzu]# echo ${array[@]}
one two three
[root@aliyun shuzu]# echo ${#array[@]}
3
[root@aliyun shuzu]# echo ${#array[*]}
3

3.数组赋值(不常用,了解即可)

[root@aliyun shuzu]# array=(one two three)
[root@aliyun shuzu]# echo ${array[*]}
one two three
[root@aliyun shuzu]# array[3]=four
[root@aliyun shuzu]# echo ${array[*]}
one two three four
[root@aliyun shuzu]# array[0]=ywxi
[root@aliyun shuzu]# echo ${array[*]}
ywxi two three four

4.数组的删除

[root@aliyun shuzu]# echo ${array[*]}
ywxi two three four
[root@aliyun shuzu]# unset array[1]        #取消下标为1的数组元素
[root@aliyun shuzu]# echo ${array[*]}      #可以看见元素“two”不见了
ywxi three four
[root@aliyun shuzu]# unset array
[root@aliyun shuzu]# echo ${array[*]}      #删除整个数组[root@aliyun shuzu]#

5.数组内容的截取和替换

这里和变量子串的替换是一样的,因为数组是特殊的变量。

[root@aliyun shuzu]# array=(1 2 3 4 5)
[root@aliyun shuzu]# echo ${array[@]:1:3}
2 3 4
[root@aliyun shuzu]# array=(`echo {a..z}`)
[root@aliyun shuzu]# echo ${array[*]}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@aliyun shuzu]# echo ${array[*]:1:3}
b c d
[root@aliyun shuzu]# echo ${array[*]:0:3}
a b c
[root@aliyun shuzu]# echo ${array[*]:0:2}
a b#替换数组元素
[root@aliyun shuzu]# array=(1 2 3 4 1 1)
[root@aliyun shuzu]# echo ${array[*]/1/a}
a 2 3 4 a a
[root@aliyun shuzu]# echo ${array[@]/1/a}
a 2 3 4 a a

三:Shell数组脚本开发实践

范例1):通过C语言型的for循环语句打印数组元素

法1:通过C语言型的for循环语句打印数组元素

[root@aliyun shuzu]# cat sz1.sh
#!/bin/bash
array=(a b c d e)
for((i=0;i<${#array[*]};i++))        #从数组的第一个下标0开始,循环数组的所有下标
doecho  ${array[i]}                #打印数组
done

法2:通过普通for循环语句打印数组元素

[root@aliyun shuzu]# cat sz2.sh
#!/bin/bash
array=(a b c d e)
for n in ${array[*]}
doecho $n
done

法3:使用while循环语句打印数组元素

[root@aliyun shuzu]# cat sz3.sh
#!/bin/bash
array=(a b c d e)
i=0
while ((i<${#array[*]}))
doecho ${array[i]}((i++))
done

范例2):通过竖向列举法定义数组元素并批量打印

[root@aliyun shuzu]# cat sz4.sh
#!/bin/bash
array=(
ywxi
ywxi02
ming
ling
ywxluo
)
for((i=0;i<${#array[*]};i++))
doecho "This is num $i,then content is ${array[$i]}"
done
echo " "
echo "array length:${#array[*]}"  脚本结果如下:
[root@aliyun shuzu]# sh sz4.sh
This is num 0,then content is ywxi
This is num 1,then content is ywxi02
This is num 2,then content is ming
This is num 3,then content is ling
This is num 4,then content is ywxluoarray length:5

范例3:将命令结果作为数组元素定义并打印

[root@aliyun shuzu]# mkdir array
[root@aliyun shuzu]# touch array/{1..3}.txt
[root@aliyun shuzu]# ls array/
1.txt  2.txt  3.txt
脚本如下:
[root@aliyun shuzu]# cat ls.sh
#!/bin/bash
dir=($(ls /scripts/practice/shuzu/array))
for((i=0;i<${#dir[*]};i++))
doecho "This is NO.$i,filename is ${dir[$i]}"
done
[root@aliyun shuzu]# sh ls.sh
This is NO.0,filename is 1.txt
This is NO.1,filename is 2.txt
This is NO.2,filename is 3.txt

四:shell数组的重要命令

1)定义命令

静态数组:

array=(1 2 3)

动态数组:

array=($(ls))

为数组赋值:

array[3]=4

2)打印命令

打印所有元素:

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

打印数组长度:

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

打印单个元素:

${array[i]}   #i为数组下标

3)循环打印的常用基本语法

[root@aliyun shuzu]# cat xh.sh
#!/bin/bash
array=(
192.168.1.1
192.168.1.2
192.168.1.3
)
#c语言for循环语法
for((i=0;i<${#array[*]};i++))
doecho ${array[i]}
done#普通for循环语法
for n in ${array[*]}
doecho $n
done

五:Shell数组相关面试题实战  

范例:利用bash for循环打印下面这句话中字母数不大于6的单次(某企业面试真题)

We are the operation and maintenance engineers, the responsibility is to ensure data security

解题思路如下:

1)先把所有的单次放到数组里,然后依次进行判断。命令如下:

[root@aliyun shuzu]# array=(We are the operation and maintenance engineers, the responsibility is to ensure data security)

2)计算变量内容的长度的常见方法

[root@aliyun shuzu]# char=ywxi
[root@aliyun shuzu]# echo $char|wc -L
4
[root@aliyun shuzu]# echo ${#char}
4
[root@aliyun shuzu]# expr  length $char
4
[root@aliyun shuzu]# echo $char|awk '{print length($0)}'
4

3)脚本实现

法1:通过数组方法实现

[root@aliyun shuzu]# cat arr.sh
#!/bin/bash
arr=(We are the operation and maintenance engineers, the responsibility is to ensure data security)
for((i=0;i<${#arr[*]};i++))
doif [ ${#arr[$i]} -lt 6 ]thenecho "${arr[$i]}"fi
doneecho ---------------for word in ${arr[*]}
doif [ ${#word} -lt 6 ]thenecho "${word}"fi
done

法2:通过awk循环实现

[root@aliyun shuzu]# arr='We are the operation and maintenance engineers, the responsibility is to ensure data security'
[root@aliyun shuzu]# echo $arr|awk '{for(i=1;i<=NF;i++) if(length($i)<=6) print $i}'
We
are
the
and
the
is
to
ensure
data

转载于:https://blog.51cto.com/13707680/2126639

Shell笔记9——Shell数组的应用实践相关推荐

  1. Linux Shell笔记1 shell编程基础

    shell语言是解释型非强类型语言. Linux Shell不区分变量的类型, 一切都是字符串类型, 变量名不能是数字开头. 变量长度没有限制, 变量可以进行比较操作和整数操作. 整数操作取决于字符串 ...

  2. linux+shell+func,Linux shell编程笔记总结

    Linux Shell学习笔记简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称.shell是用户和Linux内核之间的接 ...

  3. 如何在shell脚本中定义数组及遍历

    问题起源:脚本中定义多个监控模块,代码重复率高,仅仅模块名不同,所以思考如何精简代码? 1.如何定义数组及访问数组: var=(1 2 3 4 5) var=(a b c d e) var=('1' ...

  4. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】

    ⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...

  5. Linux学习笔记二Shell教程

    Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...

  6. shell笔记之sed编辑器的基础用法(上)

    在开始写之前,先申明,本文是自己看书后,用自己的语言总结下来的笔记,如有不对之处,还请各位博友予以指正. shell脚本最常用的功能之一就是处理文本文件,我们利用编写的shell脚本可以简化重启服务器 ...

  7. linux 数据处理软件,【shell笔记文本处理|专项】Linux数据文本处理工具(2)

    接1 file 查看文件编码 wsx@wsx-ubuntu:~$ file regular_express.txt regular_express.txt: ASCII text, with CRLF ...

  8. shell笔记[转]

    shell笔记来自 http://blog.zhangjianfeng.com/article/388 August 3rd, 2006 作者: Jeffrey 出处:http://blog.zhan ...

  9. Nginx学习笔记3:Shell脚本检测Nginx服务状态

    前言 nginx 服务启动后,我们需要对其服务状态进行监控,今天学习过程中了解到一段非常有用的小脚本,不仅可以监控Nginx,也可以用来监控其他服务 脚本 A=`ps -C nginx –no-hea ...

最新文章

  1. 题目1192:回文字符串
  2. qsort与sort()
  3. # 20155337 2017-2018-1 《信息安全系统设计基础》第一周学习总结
  4. [转载]-如何向妻子解释OOD
  5. java整数翻转_java实现整数反转
  6. python123测试_【测码学院】python自动化测试学习-自动化测试模型
  7. python自动化办公入门书籍-盘点使用Python进行自动化办公所需要的知识点
  8. Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用
  9. electron 爬坑记
  10. win7,win10系统激活工具下载
  11. 微信自动推送早安问候教程
  12. Java 学习笔记:第十一章 多线程技术
  13. Nepire的校OJ入门题解—17蓝桥选拔篇(二)
  14. BeagleBone Black– 智能家居控制系统 LAS - ESP8266 UDP 服务
  15. 多益网络社招iq_18年多益秋招iq测试题
  16. Linux root密码修改
  17. 计算机考试怎么调整字号,WPS文字如何调节字体大小突破字号72的限制实现大小随意调...
  18. 信息化、数字化、数智化
  19. 7 11 藏尾诗c语言,为你写诗:11种杂体诗,汉语太神奇
  20. 陕西的饮食历史和特点

热门文章

  1. java免安装版配置,Tomcat(免安装版)的安装与配置 配置成windows服务
  2. python 去掉文件头部几行_批量重命名文件的python代码
  3. exe打包工具_pyqt5快速上手基础篇12-使用Pyinstaller打包应用程序
  4. java引用类型使用场景_下面有关java的引用类型,说法正确的有?
  5. day01: oracle12C在Linux7.5上图形化安装部署方法:
  6. java 多项式拟合最多的项数_机器学习(1)--线性回归和多项式拟合
  7. Java设计模式(十九):解释器设计模式
  8. ubuntu 退出anaconda环境_ubuntu 安装两个Anaconda,并迁移虚拟环境
  9. 异步错误处理 -- 时机
  10. 阿里巴巴Java开发规约IDEA插件安装及使用