基于数组的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
 
 - (1)一次只赋值一个元素
 - 引用数组中元素的方式:通过索引取值
- ${arr[1]}
 - 数组中元素的索引是从0开始的,${arr[1]}表示取的是第二个元素的值
 - 注意:引用时,只给数组名,表示引用下标为0的元素。例如:$arr == ${arr[0]}
 
 - 获取数组的长度(数组中元素的个数)
- ${#arr[*]}
 - ${#arr[@]}
 
 - 获取数组中的全部元素
- ${arr[*]}
 - ${arr[@]}
 
 - 示例:生成10个随机数,并找出其中的最大值和最小
declare -a rand
declare -i max=0
declare -i min=1000000
for i in {0..9}; do
rand[$i]=$RANDOM # $RANDOM的值是一个随机数
echo ${rand[$i]}
[ ${rand[$i]} -gt $max ] && max=${rand[$i]}
[ ${rand[$i]} -lt $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]=$[ $RANDOM%100 ] # $RANDOM的值是一个随机数
done
echo ${rand[*]}
rand_length=${#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 ${rand[$[j+1 ]]} ];then
var=${rand[j]}
rand[j]=${rand[$[ j+1 ]]}
rand[$[ j+1 ]]=$var
fi
done
#echo ${rand[*]}
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 ${files[$i]} | cut -d' ' -f1)
fi
done
echo "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[${#arr[*]}]=hello
 
 
- 向非稀疏格式的数组中追加元素
 
· [root@localhost test]# echo${#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#*word}:其中word是指定的分隔符。功能:自左向右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符处的所有字符
 - 查找替换
- ${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 -le 67 ]; do
hostping 172.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.$i &> /dev/null; then
echo "$1.$i is up"
else
echo "$1.$i is down."
fi
let i++
done
}
bping() {
local j=0
# 为了看到效果,这里的255可以写成5
while [ $j -le 5 ]; do
cping $1.$j
let j++
done
}
aping() {
local x=0
while [ $x -le 255 ]; do
bping $1.$x
let x++
done
}
aping 192 
基于数组的shell脚本编写的更多相关文章
- shell脚本编写方法
		
shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell shebang ...
 - 7. Shell 脚本编写
		
一.Shell 脚本编写 1.提示用户输入一个字符串,如果是 hello,打出 yes,并每秒输出 "hello,world",否则就输出 no,实现如下: #!/bin/bash ...
 - 数组-在Shell脚本中的基本使用介绍
		
Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...
 - Shell  awk文本处理,shell脚本编写
		
Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...
 - 基于sparksql调用shell脚本运行SQL
		
[Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # uplo ...
 - shell脚本编写mind
		
首先我们要缩小这个问题的范围 如果在面试中被问到这样的问题,说说shell脚本编写思路 如:你是在公司主要负责zabbix监控的 对答如下:shell脚本这个说法挺广的,您看我这么跟您说吧,我在平时工 ...
 - shell脚本编写nginx部署脚本
		
下面为shell脚本编写的nginx的安装及修改nginx.conf的脚本,脚本比较简单: #!/bin/bash function yum_install(){ yum install epel-r ...
 - shell脚本编写自动启动服务方法
		
shell脚本编写自动启动服务方法 前言 ln :创建连接文件 默认创建的是硬连接,好比复制 ,但是两个文件会同步命令:ln ./java/android/aa.txt aaa s :创建的是软连接变 ...
 - shell脚本编写笔记
		
包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...
 
随机推荐
- Spring Boot与MyBatis的集成
			
SSM(Spring+Spring MVC+MyBatis)是当前主流的框架组合开发方式之一,普遍被应用于互联网项目中.如果要使用Spring Boot开发一个基于SSM框架的应用,那么我们要怎么做呢 ...
 - FreeMarker的应用场景
			
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一 ...
 - 静态站点生成器-md-hexo
			
推荐指数:
 - 17、vue-cli3 js项目中引入ts混用(typeScript)
			
说明: vue3.0搭建的项目,不过没有引入ts,后来需要用到一个插件是用ts写的,所以vue要用到ts... 一.安装typescript及loader npm install typescript ...
 - robot:接口入参为图片时如何发送请求
			
https://www.cnblogs.com/changyou615/p/8776507.html 接口是上传图片,通过F12抓包获得如下信息 由于使用的是RequestsLibrary,所以先看一 ...
 - logstash kafka output 日志处理
			
今天在用logstash解析日志并传送给kafka的时候,发现kafka能收到数据但数据内容已经丢失,具体如下: 在logstash output中增加输出样式之后,问题解决kafka再次接受到的内容 ...
 - SPSS数据分析基础考题
			
选择题 1. SPSS发行版本的说法,正确的是: B A. 两年发行一个新版本 B.一年发行一个新版本 C.没有任何规律 D.三年发行三个新版本 2.哪些是SPSS统计分析软件的基本窗口: A A.结 ...
 - win7和Ubuntu16.04之间相互远程控制
			
一.在win7中远程控制ubuntu16.04 步骤: 在ubuntu中通过Desktop share打开允许远程访问 ubuntu中安装xrdp 由于xrdp与unity.gnome桌面不兼容,所以 ...
 - Makefile中宏定义
			
实际上是gcc命令支持-D宏定义,相当于C中的全局#define: gcc -D name gcc -D name=definition Makefile中可以定义变量(和宏很像),但是是给make解 ...
 - JVM(一) 内存结构
			
JVM内存结构 方法区(JDK8以上叫元空间)和堆为线程共享区,虚拟机栈.本地方法栈及程序计数器为线程独占区, 还有一个没有在下图中体现的叫做直接内存(Direct Memory),不受JVM GC ...