健康!快乐!学习!思考!
分类: 系统运维
2014-11-24 23:13:19
Shell 诞生于 Unix,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的。Shell需要依赖其他程序才能完成大部分的工作,这或许是它的缺陷,但它不容置疑的长处是:简洁的脚本语言标记方式。
常见的Shell,在Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。由于bash是Linux标准默认的shell。
因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于:
如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧——或许是Perl、Tcl、Python、Ruby——或者是更高层次的编译语言比如C/C++,或者是Java。即使如此,你会发现,使用shell来原型开发你的应用,在开发步骤中也是非常有用的。
Hello World 开始
#!/bin/bash
echo "Hello World !"
为什么需要加“#!/bin/bash”就是告诉系统脚本的编译器是什么!(说明:如果想执行,首先必须保证脚本可执行的权限,授权的命令:chmod +x 你要授权 的shell的名字)
建议,如果不熟尽量不要用循环while 、for 等
定义变量时,变量名不加美元符号($),但是调用时需要加上。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
变量名的命名须遵循如下规则:
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java
do
echo "I am good at ${skill}Script"
done
变量 |
含义 |
$0 |
当前脚本的文件名 |
$n |
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# |
传递给脚本或函数的参数个数。 |
$* |
传递给脚本或函数的所有参数。 |
$@ |
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? |
上个命令的退出状态,或函数的返回值。 |
$$ |
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
转义字符 |
含义 |
\\ |
反斜杠 |
\a |
警报,响铃 |
\b |
退格(删除键) |
\f |
换页(FF),将当前位置移到下页开头 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符(tab键) |
\v |
垂直制表符 |
可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符
形式 |
说明 |
${var} |
变量本来的值 |
${var:-word} |
如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} |
如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:?message} |
如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 |
${var:+word} |
如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
算术运算符列表 |
||
运算符 |
说明 |
举例 |
+ |
加法 |
`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_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/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