基于数组的shell脚本编写
基于数组的shell脚本编写
2017年08月17日 22:56:36 momokuku123 阅读数:369

数据:变量,文件,数组

变量:存储单个元素的内存中的一块存储空间

数组:存储多个元素的内存中的连续的内存空间,数组有数组名,且索引编号从0开始。

数据结构中逻辑结构:集合、线性、树形、图形

数据结构中物理结构(也叫做存储结构):顺序、链式、索引、散列

bash shell 中的数组属于线性表,体现为所有元素的内存地址是连续的

声明一个数组

declare-a NAME:声明索引数组(索引是数值)

declare-A NAME:声明关联数组(索引是字符串)

数组中元素的赋值方式
(1)一次只赋值一个元素
arr[0]=hello
(2)一次赋值全部元素
arr=(“hello” “nihao” “who” )
(3)只赋值特定元素
arr=([0]=”nihao” [3]=”hello”)
注意:bash支持稀疏格式的数组
(4)read -a arr
引用数组中元素的方式:通过索引取值
arr[1]数组中元素的索引是从0开始的,{arr[1]} 数组中元素的索引是从0开始的,arr[1]数组中元素的索引是从0开始的,{arr[1]}表示取的是第二个元素的值
注意:引用时,只给数组名,表示引用下标为0的元素。例如:$arr == ${arr[0]}
获取数组的长度(数组中元素的个数)
${#arr[]}
${#arr[@]}
获取数组中的全部元素
${arr[
]}
arr[@]示例:生成10个随机数,并找出其中的最大值和最小declare−aranddeclare−imax=0declare−imin=1000000foriin0..9;dorand[{arr[@]} 示例:生成10个随机数,并找出其中的最大值和最小 declare -a rand declare -i max=0 declare -i min=1000000 for i in {0..9}; do rand[arr[@]示例:生成10个随机数,并找出其中的最大值和最小declare−aranddeclare−imax=0declare−imin=1000000foriin0..9;dorand[i]=$RANDOM # $RANDOM的值是一个随机数
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {rand[i]}
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {rand[i]} -gt KaTeX parse error: Expected 'EOF', got '&' at position 7: max ] &̲& max={rand[$i]}
[ KaTeX parse error: Expected '}', got 'EOF' at end of input: {rand[i]} -lt KaTeX parse error: Expected 'EOF', got '&' at position 7: min ] &̲& min={rand[$i]}
done
echo “The MAX number is $max”
echo “The MIN number is $min”
冒泡排序算法演示(对于循环语句的选取不限为while循环或for循环)#!/bin/bash
declare -a rand
declare -i rand_length
declare -i var

生成10个随机数

for i in {0…9}; do
rand[i]=i]=i]=[ $RANDOM%100 ] # $RANDOM的值是一个随机数
done
echo rand[∗]randlength={rand[*]} rand_length=rand[∗]randl​ength={#rand[*]}

echo $rand_length

开始写冒泡排序

for i in seq 0 $[ $rand_length-1] | sort -n -r;do
for((j=0;j<$i;j++));do
if [ ${rand[j]} -gt KaTeX parse error: Expected '}', got 'EOF' at end of input: {rand[[j+1 ]]} ];then
var=rand[j]rand[j]={rand[j]} rand[j]=rand[j]rand[j]={rand[KaTeX parse error: Expected 'EOF', got '}' at position 9: [ j+1 ]]}̲ rand[[ j+1 ]]=$var
fi
done
#echo KaTeX parse error: Undefined control sequence: \E at position 25: … done echo -e "\̲E̲[1;31m{rand[*]} \033[0m"

练习:写一个脚本,定义一个数组,数组中的元素是/var/log/目录下所有的以.log结尾的文件名,统计其下标为偶数的文件中的行数之和
declare -a files
files=(/var/log/.log)
declare -i lines=0
for i in $(seq 0 [[[{#files[
]}-1]); do
if [ [[[i%2] -eq 0 ]; then
let lines+=$(wc -l KaTeX parse error: Expected '}', got 'EOF' at end of input: {files[i]} | cut -d’ ’ -f1)
fi
done
echo "Lines: lines.”数组的其他功能数组元素切片例如:lines.” 数组的其他功能 数组元素切片 例如:lines.”数组的其他功能数组元素切片例如:{file[*]:2:3}:表示在显示file中的全部元素的时候,跳过前两个元素,显示后面一个元素
· [root@localhost test]# arr=(1 23 4)

· [root@localhost test]# echo${arr[*]}

· 1 2 3 4

· [root@localhost test]# echo${arr[*]:2 :1}

· 3

向非稀疏格式的数组中追加元素
例如:arr[KaTeX parse error: Expected '}', got '#' at position 2: {#̲arr[*]}]=hello …{#arr[*]}

· 4

· [root@localhost test]#arr[${#arr[*]}]=hello

· [root@localhost test]# echo${arr[*]}

· 1 2 3 4 hello

删除数组中的某个元素
例如:unset arr[2]
关联数组的赋值
例如:declare -A arr(注意关联数组需要首先声明), arr=([a]=”nihao” [b]=”nima” [c]=”nidaye”)
· [root@localhost test]# declare-A small

· [root@localhost test]#small=([mo]=1 [ku]=2)

· [root@localhost test]# echo${small[mo]}

· 1

· [root@localhost test]# echo${small[ku]}

· 2

· bash的内置字符串处理工具(了解)

字符串切片,对于变量而言

例如:name=nihaoma , echo ${name:2:3} 打印的结果为:hao
例如:name=nihaoma , echo ${name: -4} 打印的结果为:aoma
基于模式取字符串,对于变量而言
${var#word}:其中word是指定的分隔符。功能:自左向右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符处的所有字符
例如:path="/var/log/yhy.txt" , echo ${path#
/} 打印结果为:var/log/yhy.txt
${var##word}:其中word是指定的分隔符。功能:自左向右,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除字符串开头至此分隔符处的所有字符
例如:path="/var/log/yhy.txt" , echo ${path##
/} 打印结果为:yhy.txt
${var%word*}:其中word是指定的分隔符。功能:自右向左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串结尾至此分隔符处的所有字符
例如:path="/var/log/yhy.txt" , echo ${path%/} 打印结果为:/var/log
${var%%word
}:其中word是指定的分隔符。功能:自右向左,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除字符串结尾至此分隔符处的所有字符
例如:path="/var/log/yhy.txt" , echo ${path%%/*} 打印结果为:空
查找替换
${var/pattern/substi}:查找var所表示的字符串,第一次被pattern所匹配到的字符串,将其替换为substi所表示的字符串
${var//pattern/substi}:查找var所表示的字符串,所有被pattern所匹配到的字符串,将其所有匹配到的字符串替换为substi所表示的字符串
${var/#pattern/substi}:查找var所表示的字符串,行首被pattern所匹配到的字符串,将其替换为substi所表示的字符串,如果不是行首,就不替换
${var/%pattern/substi}:查找var所表示的字符串,行尾被pattern所匹配到的字符串,将其替换为substi所表示的字符串,如果不是行尾,就不替换
-查找删除
${var/pattern}:查找var所表示的字符串,第一次被pattern所匹配到的字符串删除
${var//pattern}:查找var所表示的字符串,所有被pattern所匹配到的字符串删除
${var/#pattern}:查找var所表示的字符串,行首被pattern所匹配到的字符串删除
${var/%pattern}:查找var所表示的字符串,行尾被pattern所匹配到的字符串删除
字符大小写转换
${var^^}:把var中的所有小写转换为大写
${var,}:把var中的所有大写转换为小写
变量赋值
${var:-VALUE}: 如果var变量为空,或未设置那么返回VALUE,否则返回var变量的值
${var:=VALUE}: 如果var变量为空,或未设置那么返回VALUE,并将VALUE赋值给var变量,否则返回var变量的值
${var:+VALUE}: 如果var变量不空,那么返回VALUE
${var:?ERROR_INFO}: 如果var为空,或未设置,那么返回ERROR_INFO为错误提示,否则,返回var的值
综合练习1:ping命令去查看192.168.10.1—192.168.10.10 范围内的所有主机是否在线,在线显示为up,不在线显示为down,分别统计在线主机,及不在线主机数量
#!/bin/bash

declare -i uphosts=0
declare -i downhosts=0
declare -i i=1
hostping() {
if ping -W 1 -c 1 $1 &>/dev/null; then
echo “$1 is up.”
let uphosts+=1
else
echo “$1 isdown.”
let downhosts+=1
fi
}
while [ i−le67];dohostping172.16.i -le 67 ]; do hostping 172.16.i−le67];dohostping172.16.i.1
let i++
done
echo “Up hosts: $uphosts, Down hosts: $downhosts.”

综合练习2:写一个脚本:能探测C类,B类,A类网络中所有的主机是否在线,以192开头的主机/bash

cping() {
local i=1

为了看到效果,这里的255可以写成5

while [ $i -le 5 ]; do
if ping -W 1 -c 1 1.1.1.i &> /dev/null; then
echo “1.1.1.i is up”
else
echo “1.1.1.i is down.”
fi
let i++
done
}
bping() {
local j=0

为了看到效果,这里的255可以写成5

while [ $j -le 5 ]; do
cping 1.1.1.j
let j++
done
}
aping() {
local x=0
while [ $x -le 255 ]; do
bping 1.1.1.x
let x++
done
}
aping 192

shell脚本 数组相关推荐

  1. shell oracle查询数组,shell 脚本 ---数组

    数组的定义:所谓数组,就是相同数据类型的元素按一定顺序的集合,就是把有限个类型相同的变量用一个名字命令,也就是说这些变量被定义成数组之后,它们就不在有自己的名字了,那么我们怎么找到各个变量或者元素呢? ...

  2. shell脚本数组遍历

    #! /bin/bash #数组遍历 array=(a b c d)for i in ${array[*]} doecho "The element is $i" done 执行结 ...

  3. 【 Kotlin 脚本编程Kotlin Scripting 】Linux Shell 脚本与Kotlin Scripting

    Linux 英文解释为 Linux is not Unix. Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一 ...

  4. 数组-在Shell脚本中的基本使用介绍

    2019独角兽企业重金招聘Python工程师标准>>> Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节. 下面是对 ...

  5. shell脚本编程学习之路-shell数组

    1.数组的介绍 在开发shell脚本时,定义变量采用的形式为"a=1;b=2;c=3",变量多了再一个一个定义就比较麻烦,并且要是有多个不确定的变量内容也会难以进行变量控制,于是为 ...

  6. Shell脚本攻略05-数组和关联数组

    概述 之前梳理的博文 Shell 数组 http://blog.csdn.net/yangshangwei/article/details/52372608 数组是shell脚本非常重要的组成部分,它 ...

  7. Shell脚本中的函数、数组

    Shell脚本中的函数 Shell脚本中的数组 转载于:https://blog.51cto.com/13515599/2107416

  8. shell脚本详解(六)——数组简介和排序算法

    shell脚本详解(六)--数组简介和排序算法 一.数组 1.数组的定义方法 ①.方式一: ②.方式二: ③.方式三: ④.方式四: 2.数组包括的数据类型 3.获取数组长度 4.获取数据列表 5.读 ...

  9. Shell 脚本知识回顾 (三) —— 替换、运算符、字符串、数组

    一.Shell替换:Shell变量替换,命令替换,转义字符 如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: [cpp] v ...

最新文章

  1. 1024程序员福利日 | 网易云送暖心礼包,只要你是程序员
  2. 【深入JavaScript】3.JavaScript继承的实现总结
  3. 使用kubectl管理k8s集群(三十)
  4. 测视力距离5米还是3米_7岁男孩近视猛涨300度!眼科专家提醒:保护孩子视力这一点很关键...
  5. 在 CentOS 上安装和配置 Xen 虚拟化
  6. Django:模板与视图
  7. 【Vue2.0】—props 配置(十三)
  8. Spring Boot 2 (三):Spring Boot 开源软件都有哪些?
  9. gcc/g++参数详解
  10. redis的持久化(RDBAOF的区别)
  11. 文件夹加密软件排行榜
  12. kali解压deb_Kali下安装网易云音乐
  13. 数据结构之数组和列表
  14. 计算机组成原理测试,计算机组成原理测试题及答案
  15. Java如何得到时间格式dd-MMM-yy???
  16. 自写自用的移动小程序故障管理扫码报修系统
  17. 【小说】玻璃碎片-第三章
  18. F28379D烧写双核程序(在线离线)
  19. 二级c语言程序基础知识,计算机二级《C语言》基本知识点
  20. OpenCV视频质量检测--清晰度检测

热门文章

  1. 企业财务制度二--(三)所有者权益类科目 3131 本年利润(转载)
  2. 网关(Gateway)详解
  3. word 插多张图片 如何左右分开排版 一行三张图片
  4. java学习day005+day006
  5. 双色球彩票系统升级版
  6. 斯金纳箱:人类学习的秘密
  7. Arduino单片机智能土壤灌溉浇水系统根据土壤湿度温度光照智能浇水
  8. PCN-224/PCN-224(H)/金属有机骨架材料/cas1476810-88-4红棕色粉末能够细胞成像并能作为光敏剂对肿瘤进行治疗
  9. 第八周拓展实践1小明借书
  10. 达梦数据库--管理工具,数据迁移工具使用