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 $i
3
变量的自增:
var=$[$var+1]
let var+=1
let var++
[root@localhost ~]# i=2
[root@localhost ~]# let i+=1
[root@localhost ~]# echo $i
3
变量的自减:
var=$[$var-1]
let var-=1
let var--
[root@localhost ~]# i=2
[root@localhost ~]# let i--
[root@localhost ~]# echo $i
1
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" ]
>:是否大于
/dev/null || echo "Unknow"
sum=$(cat $1 |grep '^$' |wc -l)
sum1=$(cat $2 |grep '^$' |wc -l)
echo $sum
echo $sum1
结果: [root@magedu md0]# bash sum.sh /etc/issue /etc/fstab
1
1
示例:通过参数传递一个用户名给脚本,此用户名如果不存在则添加,参数 不为1,则报错.
脚本: #!/bin/bash
#
[ $# -eq 1 ] && echo "" >/dev/null || echo "Unknow"
if [ $ ]
结果: [root@magedu md0]# bash sum.sh centos
centos 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 1
if [ $1 -eq $2 ];then
echo "$1 is same $2"
elif [ $1 -gt $2 ];then
echo "max is $1"
else
echo "max is $2"
fi
结果: [root@magedu md0]# bash sum.sh 2 3
max is 3
[root@magedu md0]# bash sum.sh 2 2
2 is same 2
[root@magedu md0]# bash sum.sh 3 2
max 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: " char
if [ $char == "quit" ];then
exit 1
else
echo "$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: hello
hello
磁盘高级管理:
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
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com