shell脚本编程基础(1)及RAID阵列
shell脚本:
Linux从底层到上层的系统架构:硬件-->内核-->库(lib)-->shell-->用户。
shell既是一种命令语言,也是程序设计语言(shell脚本),作为一种命令语言,它提供了用户与内核的交互界面,互动式的解释和执行用户所输入的命令;作为程序设计语言,它又定义了各种变量和参数,并且提供了许多在高级语言中才具有的控制结构,比如循环和分支。
写shell脚本的一般规范:
# Name:init_app_jboss.sh //脚本的名称
# Version Number:1.00 //脚本修改后的版本
# Type:config middleware for initing server //脚本的功能
# Language:bash shell //脚本shell语言
# Date:2013-06-19 //编写时间
# Author:magedu //脚本作者
# Email:magedu@gmail.com //作者邮件
注意:#开头的行会被解释器忽略,空白行也会被解释器忽略
shell脚本当中的变量:
本地变量:作用域为当前的shell进程,包含环境变量
变量的赋值:name=value 比如:a=1; a=$(cat /etc/passwd |wc -l)
变量的引用:$name $a
变量的查看:set
变量的撤销:uset name 注意:此次不是引用变量,所有不需要加$
环境变量:作用域为当前的shell进程及派生出来的子进程
变量的赋值: declare -x name=[value] 或 export name=[value]
变量的查看:env,export,declare -x,printenv
局部变量:普通的变量,只在创建它的shell脚本中有效。
位置参数变量: 表示向脚本传递参数
[root@localhost tmp]# bash sum.sh $1 $2 $3
$1 $2 $3就是脚本要用到的参数变量
特殊变量:向脚本传递参数
$0: 脚本文件路径自身
$@: 取出给定脚本参数的路径 全部一起取并显示
$#: 表示脚本参数的个数
$*: 取出给定脚本参数的路径 单个单个取并显示
$?: 查看上次执行后所返回的状态码
比如: [ $# -eq 2 ] && echo "yes,you are right" || echo "pleses give me two digital" 表示传递两个参数给脚本,如果是2个就输出yes,you are right,如果不是就输出please give me two digital。
shell脚本当中的算术运算:
+、-、*、/、%
注意:shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么,所以要进行一些算术运算时,需要要用到一些命令如 let、declare、expr、双括号等。
语法:
let var=$sum1+$sum2
var=$[$sum1+$sum2]
var=$(($sum1+$sum2))
var=$(expr $sum1 + $sum2)
注意:*、/、%在有些情况下需要转义\,比如在var=$(expr $sum1 \* $sum2)
变量的自曾自减:
变量做某种运算后回存到此变量中;
比如:let i=$i +# #表示数字
let i+=#
[root@localhost ~]# i=1[root@localhost ~]# let i=$i+2[root@localhost ~]# echo $i3
变量的自增:
var=$[$var+1]
let var+=1
let var++
[root@localhost ~]# i=2[root@localhost ~]# let i+=1[root@localhost ~]# echo $i3
变量的自减:
var=$[$var-1]
let var-=1
let var--
[root@localhost ~]# i=2[root@localhost ~]# let i--[root@localhost ~]# echo $i1
shell脚本之条件测试:
判断某需求是否满足,需要用到测试机制来实现:
1、通过命令执行后返回的状态码来判断
echo $? 0:表示正常 1-255:表示失败
[root@localhost ~]# sum=$[$sum1+$sum2][root@localhost ~]# echo $?0
2、通过测试表达式:
test expression 或[expression] 或`expression`
注意:EXPRESSION两端必须有空白字符,否则为语法错误;
2.1 数值测试
-eq:是否等于
-ne:是否不等于
-gt:是否大于
-lt:是否小于
-le:是否小于等于
示例:比较用户centos和ubuntu哪个的uid更大.
[root@localhost ~]# bash sum1.sh MAX is 1004#!/bin/bash# a=$(id -u centos)b=$(id -u ubuntu)[ $a -gt $b ] && echo "MAX is $a" ||echo "MAX is $b"
2.2 字符串的比较
==:是否等于
建议变量比较的时候加上 “” [ ubuntu == "$u" ]
>:是否大于
<:是否小于
!=:是否小于
=~:左侧的字符串是否能被右侧的所匹配(包含)
-z:判断字符串是否为空
2.3 存在性测试
-a file
-e file 文件的存在性测试,如果存在,则为真
-s file 文件是否有内容
文件的类型测试
-b file :块设备文件
-c file:字符文件
-f file:文本
-d file:目录
-h 或者 -L : 是否为符号链接
-p file:管道文件
-S file:套接字文件,比如mysql的mysql.sock
[ -f /var/log/message ]
[ -f message]
2.4 文件权限测试
-r 对当前用户可读
-w 对当前用户可写
-x 对当前用户可执行
-O file 当前用户是否为文件属主
-G file 当前用户是否为文件属组
2.5 时间戳
-N file 文件自从上一次读操作之后,是否被改过
2.6 双目测试
FILE1 -ef FILE 是否指向同一文件系统的相同inode的硬链接
FILE1 -nt FILE file1文件是否新于file2
FILE1 -ot file file1文件是否旧于file2
shell脚本中可以用exit [n] n表示自己可以指定一个状态码
注意:shell脚本中,一旦遇到exit时,即将会退出
示例: 写一个脚本,通过命令传递两个文本路径给脚本,计算空行之和,参数大于两个报错
脚本: #!/bin/bash#[ $# -eq 2 ] && echo "" >/dev/null || echo "Unknow"sum=$(cat $1 |grep '^$' |wc -l)sum1=$(cat $2 |grep '^$' |wc -l)echo $sumecho $sum1结果: [root@magedu md0]# bash sum.sh /etc/issue /etc/fstab11
示例:通过参数传递一个用户名给脚本,此用户名如果不存在则添加,参数 不为1,则报错.
脚本: #!/bin/bash#[ $# -eq 1 ] && echo "" >/dev/null || echo "Unknow"if [ $ ]结果: [root@magedu md0]# bash sum.sh centoscentos is exist[root@magedu md0]# bash sum.sh centos1[root@magedu md0]# vim sum.sh
3、条件判断(选择分支)
shell脚本的执行是顺序执行的,所以脚本无非就是语法加命令的堆积。
选择分支
单分支的if语句:
if 测试条件;
then
代码分支
fi
双分支的if语句
if 测试条件;then
条件为真的时候执行的分支
else
条件为假的时候执行的分支
fi
多分支的if语句
if 测试条件;then
条件为真的时候执行的分支
elif 测试条件;then
elif 测试条件;then
else
条件为假的时候执行的分支
fi
示例:通过命令参数,给定两个数字,输出其中交大的数值 ,如果参数不为2,则报错
脚本: #!/bin/bash#[ $# -eq 2 ] && echo "" >/dev/null || echo "Unknow" && exit 1if [ $1 -eq $2 ];thenecho "$1 is same $2"elif [ $1 -gt $2 ];thenecho "max is $1"elseecho "max is $2"fi结果: [root@magedu md0]# bash sum.sh 2 3max is 3[root@magedu md0]# bash sum.sh 2 22 is same 2[root@magedu md0]# bash sum.sh 3 2max is 3[root@magedu md0]# bash sum.sh 3 Unknow
shell脚本之用户交互:
read [option] 。。。。
-p:提示符
-t:timetout
写一个脚本,提示用户输入一个字符串,如果输入的是quit,则退出,否则输出其输入的内容
脚本:#!/bin/bash#read -p "please give me two charcet: " charif [ $char == "quit" ];thenexit 1elseecho "$char"fi结果:[root@magedu md0]# bash sum.sh please give me two charcet: quit[root@magedu md0]# bash sum.sh please give me two charcet: hellohello
磁盘高级管理:
RAID:磁盘冗余阵列
表示多个独立的硬盘按照不同的方式组合起来,形成一个虚拟的硬盘来提升性能和冗余。
可以解决的问题:
提供IO能力、提供磁盘的耐用性,RAID在管理和扩展、在性能上及在可靠性和可用性上都有优势
镜像冗余:比如raid1
1、镜像冗余使用了磁盘镜像的技术
2、磁盘镜像是一个简单的虚拟化技术,每个I/O操作都会在两个磁盘上执行,两个磁盘看起来像一个磁盘一样
3、镜像冗余可以提高磁盘的读性能
校验冗余:raid3 raid5
1、根据冗余算法计算阵列中成员磁盘上数据的校验信息,将校验信息保存在
2、其他的磁盘资源上
3、保证了数据的可靠性
4、和镜像冗余相比,校验冗余的开销更小
RAID实现的方式:
1、外接式磁盘阵列:通过扩展卡提供适配能力
2、内接式磁盘阵列:主板集成RAID控制器
3、software RAID:软磁盘阵列
RAID0:已条带的形式将数据均匀分布在阵列的各个磁盘上
组成:至少2个
优点:极高的磁盘读写速率、不存在校验,不占用太多CPU资源
缺点:无冗余,不能应用于对数据安全性较高的环境
RAID1:已镜像为冗余方式,对虚拟磁盘上的数据进行多分拷贝,放在磁盘成员上
组成:至少2个
优点:具有100%数据冗余性,提高最高的数据安全保障,理论上可以实现2倍的读取速率
缺点:开销大,磁盘利用率只有50%,在写性能上提示不大
RAID3:数据块被分为更小的块并行传输到各个成员磁盘上,同时计算XOR校验数据并存放到专用的校验磁盘上
组成:至少3块
优点:读写性能都比较好,当磁盘损坏时,对整体吞吐量影响较少,减少了开销
缺点:控制器设计复杂,校验磁盘的写性能有瓶颈
RAID5: 采用独立存取的阵列方式,校验信息被均匀的分散到阵列的各个磁盘上
组成:至少3个
优点:读性能比较高,中等的写性能,校验信息的分布式存取,避免出现写操作的瓶颈
缺点:控制器设计复杂,磁盘重建的过程比较复杂
RAID10:结合RAID1和RAID0,先镜像,在条带化
组成:最低4个
优点:读性能很高,写性能比较好,数据安全性好,允许同时有N个磁盘失效
缺点:磁盘空间开销大,利用率只有50%、
RAID50: 结合RAID5和RAID0,先实现RAID5,在条带化
组成:至少6个
优点:比RAID5有更好的读性能,比相同容量的RAID5重建时间更短,可以容许N个磁盘同时失效
缺点:设计复杂,比较难实现,同一个RAID5组内的两个磁盘失效会导致整个阵列的失效
在做多RAID组合当中,RAID0的性能最好,RAID1的数据冗余度最高,相同容量下RAID和RAID1的磁盘开销最大。
软RAID阵列,比如用mdadm工具
mdadm命令:
选项:
-C:创建
-A:装配
-F:监控
-f:人为的损坏 -r(移除) -a(添加)
-n # 使用#个设备来创建次RAID
-l # 指定要创建的RAID级别
-a (yes|no)自动创建目标RAID设备文件
-c 指定块大小
-x # 指定空闲盘个数
-D 显示raid的详细信息
-S 停止RAID
示例:创建一个RAID1阵列,要求文件系统为ext4,有一个空闲盘,开机自动挂载到/md0目录下。
先创建三个Linux raid autodetect磁盘
/dev/sdb5 12587008 12791807 102400 fd Linux raid autodetect
/dev/sdb6 12793856 12998655 102400 fd Linux raid autodetect
/dev/sdb7 13000704 13205503 102400 fd Linux raid autodetect
[root@magedu md0]# mdadm -C /dev/md127 -n 2 -l 1 -a yes -c 1M -x 1 /dev/sdb[5,6,7][root@magedu md0]# mdadm -D /dev/md127
可以人为的损坏:mdadm /dev/md127 -f /dev/sdb5
可以移除:mdadm /dev/md127 -r /dev/sdb5
可以添加:mdadm /dev/dm127 -a /dev/sdb5
转载于:https://blog.51cto.com/lanxianting/1751599
相关文章:

freemarker基本语法及实例
EG.一个对象BOOK 1.输出 ${book.name} 空值判断:${book.name?if_exists }, ${book.name?default(‘xxx’)}//默认值xxx ${ book.name!"xxx"}//默认值xxx 日期格式:${book.date?string(yyyy-MM-dd)} 数字格式:${boo…
前百度主任架构师创业,两年融资千万美元,他说AI新药研发将迎来黄金十年...
「AI技术生态论」 人物访谈栏目是CSDN发起的百万人学AI倡议下的重要组成部分。通过对AI生态专家、创业者、行业KOL的访谈,反映其对于行业的思考、未来趋势的判断、技术的实践,以及成长的经历。2020年,CSDN将对1000人物进行访谈,形…
Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序
Linux环境:CentOS7.2 一.安装JDK 安装好的CentOS会自带OpenJdk,最好还是先卸载系统自带的JDK,然后自己重新去Oracle网站下载最新的JDK安装。 1.卸载系统自带的JDK 查看java信息 # java -version 查看JDK # rpm -qa | grep java 或者 还…
(转)详解css3弹性盒模型(Flexbox)
今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动、完美实现垂直水平居中的新特性。 Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性。 Flexbox布局的主体思想是似的元素可以改变大小以适应可用空间,当…
Java开发环境的搭建以及使用eclipse创建项目
一、Java 开发环境的搭建 这里主要说windows环境下怎么配置Java环境。如果是Linux环境参考本博客另一篇文章即可: Linux环境安装卸载JDK 1.首先安装JDK java的SDK简称JDK。 去官网下载最新的JDK即可: http://www.oracle.com/technetwork/java/javase…
MMIT冠军方案 | 用于行为识别的时间交错网络,商汤公开视频理解代码库
作者 | 商汤出品 | AI科技大本营(ID:rgznai100)本文主要介绍三个部分:一个高效的SOTA视频特征提取网络TIN,发表于AAAI2020ICCV19 MMIT多标签视频理解竞赛冠军方案,基于TIN和SlowFast一个基于PyTorch,包含大…

MySQL的主从服务器配置
MySQL的主从服务器配置常见开源数据库有:MySQL,PostgreSQL,SQLite等,商业性质的:Oracle,Sql Server,DB2,Sybase,Infomix其中,Oracle的版本有Oracle 11g,Oracl…

Anaconda中安装Orange3脚本-完整版
2019独角兽企业重金招聘Python工程师标准>>> #Anaconda中安装Orange3脚本,完整版。包括插件的安装,在脚本中一次完成。 sudo apt-get update sudo apt-get -y install git python-pip python-virtualenv python-qt4-dev python3-pyqt4 libqt…
使用eclipse创建Struts2项目
eclipse版本: Kepler Service Release 1 http://www.eclipse.org/downloads/ struts版本:2.3.16 http://struts.apache.org/ 1.新建web项目 打开Eclipse,新建一个web项目"Struts2" 项目名字 勾选 web.xml选项 建好的…

8、进程通信-匿名管道
匿名管道 一个单向,未命名的管道,通常用来在一个父进程和一个子进程间传输数据。只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。 BOOL CreatePipe( PHANDLE hReadPipe, // read handle PHANDLE hWriteP…
Enhanced-RCNN: 一种高效的比较句子相似性的方法 |WWW 2020
作者 | 彭爽出品 | AI科技大本营(ID:rgznai100)国际顶级会议WWW2020将于4月20日至24日举行。始于1994年的WWW会议,主要讨论有关Web的发展,其相关技术的标准化以及这些技术对社会和文化的影响,每年有大批的学者、研究人…

直接可以拿去用的正则验证表达式
直接可以拿去用的正则验证表达式为了方便自己也方便初学的学弟们,自己总结了网上的众多正则验证式,现分享给大家,可以直接拿去用。一、校验数字的1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n…
家庭局域网开启AP隔离利用无线路由器互连
一开始可以上网,可以ping网关192.168.1.1,但是几台电脑之间就是不能互ping。 其实,真实的原因就是没有开启无线路由器的AP隔离。 在浏览器中输入192.168.1.1进入路由搜索一般用户名密码都是admin,具体请参见自己路由的说明书 操…
通过 Python 代码实现时间序列数据的统计学预测模型
来源 | DeepHub IMBA封图 | CSDN 付费下载于视觉中国 在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析。 目标是:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。原始数据:2017-01-01 到 201…

神色洋溢的 域名背后的故事
前短时间,我刚申请一个域名,好的顶级域名都被被人一拥而上的都强去了,我只好找那些申请好的用户买呀,这叫炒作,就是这样的抄起来的。你说平常一个也就100左右就搞定,可是现在要是到那票手里,那就…

Rust语言开发基础(六)基础语法
2019独角兽企业重金招聘Python工程师标准>>> 一、变量的定义和使用 其它常见的编程语言对变量的定义通常是通过声明类型和使用关键new来创建一个变量,但Rust不是,Rust使用关键字let。 1. 变量绑定通过let实现 fn main() { let x 5; } 2. 变量…
400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划
作者 | 无名之辈FTER责编 | 夕颜出品 | 程序人生(ID:coder_life)本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制…
Linux配置SSH无密码登陆
可以使用“公钥私钥"认证的方式来进行ssh登录。 所谓 "公钥私钥"认证方式,就是首先在客户机上创建一对公钥和私钥,公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa 然后把公钥文件放到目标服务器…
Linux进程浏览器htop安装与使用
htop 是一个 Linux 下的交互式的进程浏览器,可以用来替换Linux下的top命令。当前具有按树状方式来查看进程,支持颜色主题,可以定制等特性。其实htop是top的加强版,增加了很多功能。 官网 http://hisham.hm/htop/ 下载地址http:/…
什么?神经网络还能求解高级数学方程?
来源 | 数据派 THU封图 | CSDN 付费下载于视觉中国 Facebook AI建立了第一个可以使用符号推理解决高级数学方程的AI系统。通过开发一种将复杂数学表达式表示为一种语言的新方法,然后将解决方案视为序列到序列的神经网络的翻译问题,我们构建了一个在解决积…

***和******
网络是一把双刃剑,它在人类社会的发展中起着越来越重要作用,但同时,网络自身的安全问题也像挥之不去的阴影时刻笼罩在人们心头。据不完全统计,全世界平均每 20秒钟就发生一起******事件,互联网上大约有20万个***网站可…
Linux监控工具dstat
dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都…

9月16号晚上,Asuka有一场关于Windows 7组策略的Webcast,欢迎兄弟们来捧场
之所以选题在组策略之一块,是因为Windows 7和2008 R2对于组策略有了很大的功能上的增强,但是很多IT人员都无法意识或者去重视这一块内容,所以我将从下面这3个角度去介绍这些更新。如果您正好有时间,那不妨来技术交流一番:)直播进入…

腾讯天衍实验室联合微众银行研发医疗联邦学习 AI利器让脑卒中预测准确率达80%
近几年,医疗行业正在经历一场数字化转型,这场基于大数据和AI技术的变革几乎改变了整个行业的方方面面,将“信息就是力量”这句箴言体现的淋漓尽致,人们对人工智能寄以厚望,希望它能真正深入临床一线,帮助医…

JavaSript模块化 AMD CMD 详解.....
模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割…
在Eclipse中使用Maven构建Spring项目
最新版的Spring需要使用Maven构建,本文讲述怎么在Eclipse构建Maven项目,以配置Spring项目为例。 maven简单介绍 maven是构建工具,也是构建管理工具。ant只是构建工具,因为不支持生成站点功能,只有预处理,编…

Go 语言官网全新改版
2019独角兽企业重金招聘Python工程师标准>>> 前两天发现 Go 语言官网改版了,布局由原来的左中右变成了上中下结构,主色调没有变,整体依然保持简洁的风格。在首页添加了一个叫 Playground 的模块,它可以编译、运行你输入…
就在今晚 | 港科大李世玮教授问诊未来,开辟大湾区新航路
阳春三月,万象更新,2020年注定是不平凡的一年!有激荡就会遇见变革,有挑战就会迎来机遇。今天总会过去,未来将会怎样?香港科大商学院内地办事处重磅推出全新升级的《袁老师访谈录》全新系列【问诊未来院长系…

NLP(Natural Language Processing)
https://github.com/kjw0612/awesome-rnn#natural-language-processing 通常有: (1)Object Recognition (2)Visual Tracking (3)Image Generation (4)Video Analysis NLP: (1)Language Modeling (2)Speech Recognition…
Linux环境编程
1.__sync_fetch_and_add和__sync_bool_compare_and_swap gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *p…