Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120942
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-27 00:23
个人简介

健康!快乐!学习!思考!

文章分类

全部博文(11)

文章存档

2015年(3)

2014年(8)

我的朋友

分类: 系统运维

2014-11-24 23:13:19

Shell学习总结

1、 shell简介

Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的。Shell需要依赖其他程序才能完成大部分的工作,这或许是它的缺陷,但它不容置疑的长处是:简洁的脚本语言标记方式。

常见的Shell,在Unix/Linux上常见的Shell脚本解释器有bashshcshksh等,习惯上把它们称作一种Shell。由于bashLinux标准默认的shell

2、 什么时候可以用shell

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要用心写一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:

  • 简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。
  • 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
  • 开发容易:可以在短时间内完成一个功能强大又好用的脚本。
    但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell
  1. 资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)。
  2. 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++FORTRAN 来处理)。
  3. 有跨平台(操作系统)移植需求(一般使用C Java)。
  4. 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)。
  5. 对于影响系统全局性的关键任务应用。
  6. 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵、破解、恶意破坏等等。
  7. 项目由连串的依赖的各个部分组成。
  8. 需要大规模的文件操作。
  9. 需要多维数组的支持。
  10. 需要数据结构的支持,比如链表或数等数据结构。
  11. 需要产生或操作图形化界面 GUI
  12. 需要直接操作系统硬件。
  13. 需要 I/O socket 接口。
  14. 需要使用库或者遗留下来的老代码的接口。
  15. 私人的、闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)。

如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧——或许是PerlTclPythonRuby——或者是更高层次的编译语言比如C/C++,或者是Java。即使如此,你会发现,使用shell来原型开发你的应用,在开发步骤中也是非常有用的。

3、 第一个shell

Hello World 开始

     #!/bin/bash 

     echo "Hello World !"
为什么需要加“#/bin/bash”就是告诉系统脚本的编译器是什么!(说明:如果想执行,首先必须保证脚本可执行的权限,授权的命令:chmod +x 你要授权     shell的名字
建议,如果不熟尽量不要用循环while for 

4、变量

定义变量时,变量名不加美元符号($),但是调用时需要加上。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。

     变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-zA-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java

     do

            echo "I am good at ${skill}Script"

     done

 

5shell的特殊变量汇总

变量

含义

$0

当前脚本的文件名

$n

传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$?

上个命令的退出状态,或函数的返回值。

$$

当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID

 

例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:


 

6、转义字符

转义字符

含义

\\

反斜杠

\a

警报,响铃

\b

退格(删除键)

\f

换页(FF),将当前位置移到下页开头

\n

换行

\r

回车

\t

水平制表符(tab键) 

\v

垂直制表符

可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符

7、变量替换

形式

说明

${var}

变量本来的值

${var:-word}

如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。

${var:=word}

如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word

${var:?message}

如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。

${var:+word}

如果变量 var 被定义,那么返回 word,但不改变 var 的值。

 

8、运算符列表

 

算术运算符列表

运算符

说明

举例

+

加法

`expr $a + $b` 结果为 30

-

减法

`expr $a - $b` 结果为 10

*

乘法

`expr $a \* $b` 结果为  200

/

除法

`expr $b / $a` 结果为 2

%

取余

`expr $b % $a` 结果为 0

=

赋值

a=$b 将把变量 b 的值赋给 a

==

相等。用于比较两个数字,相同则返回 true

[ $a == $b ] 返回 false

!=

不相等。用于比较两个数字,不相同则返回 true

[ $a != $b ] 返回 true


注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]

 

关系运算符列表

运算符

说明

举例

-eq

检测两个数是否相等,相等返回 true

[ $a -eq $b ] 返回 true

-ne

检测两个数是否相等,不相等返回 true

[ $a -ne $b ] 返回 true

-gt

检测左边的数是否大于右边的,如果是,则返回 true

[ $a -gt $b ] 返回 false

-lt

检测左边的数是否小于右边的,如果是,则返回 true

[ $a -lt $b ] 返回 true

-ge

检测左边的数是否大等于右边的,如果是,则返回 true

[ $a -ge $b ] 返回 false

-le

检测左边的数是否小于等于右边的,如果是,则返回 true

[ $a -le $b ] 返回 true

 

学习实例

硬盘空间监控

Location=/

Disk_Used_Rate=$(df -h | grep $Location | awk '{print $5,$6}')

echo "根分区已用:"$Disk_Used_Rate>>1.txt

 

这里用到了grep awk等关键性的命令

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

awk

 

awk 用法:awk ' pattern {action} '

>> >介绍

> 直接把内容生成到指定文件,会覆盖源文件中的内容,还有一种用途是直接生成一个空白文件,相当于touch命令,>>尾部追加,不会覆盖掉文件中原有的内容

内存监控

#memory_used_rate

LoadMemory=$(cat /proc/meminfo | awk '{print $2}')

Total=$(echo $LoadMemory | awk '{print $1}')

Free1=$(echo $LoadMemory | awk '{print $2}')

Free2=$(echo $LoadMemory | awk '{print $3}')

Free3=$(echo $LoadMemory | awk '{print $4}')

Used=`expr $Total - $Free1 - $Free2 - $Free3`

Used_Rate=`expr  $Used/$Total*100 | bc -l`

Memory_Used_Rate=`expr  $Used_Rate/1 | bc`

echo "内存已用:"$Memory_Used_Rate%

 

内存计算公式

MemTotal:        1915708 kB

MemFree:         1512780 kB

Buffers:           41024 kB

Cached:           132536 kB

 

Used= MemTotal- MemFree- Buffers- Cached

使用率Used/ MemTotal

bc常用介绍参数
一般情况下,我们使用不带任何参数的bc命令。
bc
如果需要bc不输出提示信息,可以加上-q参数:
bc -q
如果要使用强大的数学库,比如计算三角函数,需要加上-l参数:
bc -l

 

 

CPU监控

 

#cpu_used_rate

Log1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')

Sys1=$(echo $Log1 | awk '{print $4}')

Total1=$(echo $Log1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

 

sleep 0.5

 

Log2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')

Sys2=$(echo $Log2 | awk '{print $4}')

Total2=$(echo $Log2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

 

Sys=`expr $Sys2 - $Sys1`

Total=`expr $Total2 - $Total1`

Cpu_Rate=`expr $Sys/$Total*100 | bc -l`

Cpu_Used_Rate=`expr  $Cpu_Rate/1 | bc`

echo "CPU已用:"$Cpu_Used_Rate%>>3.txt

 

 

#那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:

#cpu usage=(idle2-idle1)/(cpu2-cpu1)*100

#cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100

 

输出解释
CPU
每个参数意思(以第一行为例)为:
参数 解释
user 
从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies ,不包含 nice值为负进程。1jiffies=0.01
nice
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies
system
从系统启动开始累计到当前时刻,核心时间(单位:jiffies
idle
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies
iowait
从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies
irq
从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies
softirq
从系统启动开始累计到当前时刻,软中断时间(单位:jiffies

 

proc目录的介绍

proc目录结构

 

 

/proc/cpuinfo:记录了这台机器的cpu相关信息。/proc/meminfo:记录了相应的内存信息。/proc/apm:包含了高级电源管理(Advanced Power Management)相关的信息。/proc/cmdline:记录了系统启动的时候传递给内核的一些参数。/proc/loadavg:记录了系统之前一分钟,五分钟和十分钟的cpu负载。/proc/uptime:记录了系统从启动开始到现在经过的秒数和系统空闲的秒数。

 

关于这个proc 参考

http://blog.sina.com.cn/s/blog_502c8cc40100nc2o.html

 


阅读(2177) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~