shell编程
SRV=srv.com.cn
echo $SRV
全局变量
export SRV
变量的运算
expr 1 + 2 - 3 \* 4 / 5
运算1加2减3乘4除5
环境变量
全局配置文件 /etc/profile
用户配置文件 ~/.bash_profile
echo $PATH
PATH="/opt/bin:$PATH"
预定义变量
$# 命令行中参数的个数
$* 所有未知参数的内容
$? 上一条参数执行会返回的状态,0为正常.
$$ 当前所在进程的进程号
$! 后台运行的最后一个进程号
$0 当前执行的进程/程序名
--------------------------------------------------
条件测试操作-------------------------------------------
-----------------------------------------------------
------------
test 命令
------------
条件成立时,返回结果为0
-d 是否为目录 Directory
-e 测试文件是否存在 Exist
-f 测试是否为文件 File
-r 测试当前用户是否有权限读写 Read
-w write权限
-x excute权限
-L 是否为link文件
例如:
-------------------------------------------
[root@test ~]# [ -e /etc/sysconfig ]
[root@test ~]# echo $?
0
[root@test ~]# [ -e /etc/sysconfi ]
[root@test ~]# echo $?
1
-------------------------------------------
例如:
-----------------------------------------------------------
&& 表示如果条件成立,则。。。。
-----------------------------------------------------------
[root@test ~]# [ -e /etc/sysconfig ] && echo "yes"
yes
[root@test ~]# [ -e /etc/sysconfi ] && echo "yes"
[root@test ~]#
------------------------------------------------------------
解释:如果/etc/sysconfig存在,则输出yes
------------------------------------------------------------
------------------------------------
整数比较 [ 整数1 操作符 整数2 ]
------------------------------------
常用操作符
-eq 等于(equal)
-ne 不等于(no equal)
-gt 大于(Greater Than)
-lt 小于 (less than)
-le 小于或者等于(lesser or equal)
-ge 大于或者等于(greater or equal)
例如:
-----------------------------------------------------------------
` ` 反引号表示结果输出, wc 表示计算当前用户的数量
------------------------------------------------------------------
[root@test ~]# who | wc -l
2
[root@test ~]# who
root tty1 2011-08-24 01:01
root pts/0 2011-08-24 04:42 (211.1.1.100)
[root@test ~]# [ `who | wc -l` -le 10 ] && echo "yes"
yes
------------------------------------------------------------------
解释:查询当前系统登录的用户,如果数量小于或者等于10,输出yes
-------------------------------------------------------------------
------------------------------------------------------
[root@test ~]# BootUsage=`df -hT |grep /boot |awk '{print $6}' |cut -d "%" -f 1`
[root@test ~]# [ $BootUsage -gt 10 ] && echo "yes"
yes
[root@test ~]# df -hT |grep /boot
/dev/sda1 ext3 99M 12M 82M 13% /boot
-------------------------------------------------------
解释,如果/boot使用量大于或者等于10,则输出yes
-------------------------------------------------------
字符串比较
格式:
[ 字符串1 = 字符串2 ] 等于
[ 字符串1 != 字符串2 ] 不等于
[ -z 字符串 ] 字符串为空
例如:
---------------------------------------------------------------------
[root@test ~]# read -p "Location:" FilePath
Location:/etc/init.d
[root@test ~]# [ $FilePath = /etc/init.d ] && echo "yes"
yes
----------------------------------------------------------------------
解释:读取键盘输出字符并赋值FilePath,如果其等于/etc/init.d则输出yes
-----------------------------------------------------------------------
----------------------------------------------
逻辑测试:
格式: [ 表达式1 ] 操作符 [ 表达式2 ]
-a或&& “而且”的意思。真真为真,其一为假则为假。
-o或|| “或者”的意思。全假才是假。
! 逻辑否,条件不成立,返回结果为真。
----------------------------------------------
******************************************************************
分支判断**********if语句
*******************************************************************
@@@@@@@@@@@@@@@@@@@@@
if条件语句---单分支结构
@@@@@@@@@@@@@@@@@@@@@
-------------------
if 磁盘空间>80%
then 报警
fi
-------------------
脚本例子:
----------------------------------------
#!/bin/bash
#注释:如果磁盘空间超过80%,报警。
RATE=`df -hT |grep /boot |awk '{print $6}' |cut -d "%" -f 1`
if [ $RATE -gt 80 ]
then
echo "Warning,disk is full of 80%"
fi
-----------------------------------------
@@@@@@@@@@@@@@@@@@@@@@@
if条件语句----双分支结构
@@@@@@@@@@@@@@@@@@@@@@@
--------------------------------------
if 3306端口是否在监听状态
then mysql 服务处于运行状态
else 启用mysql服务
fi
---------------------------------------
例子:
------------------------------------------------------------------
#!/bin/bash
#判断network服务是否在运行,是则输出提示,否则启动network服务
/etc/init.d/network status &> /dev/null
#查询networkl状态,并取值导出
if [ $? -eq 0 ]
then
echo "network is running!"
else
/etc/ini.d/network restart
fi
--------------------------------------------------------------------
@@@@@@@@@@@@@@@@@@@@
if 条件语句的多分支结构
@@@@@@@@@@@@@@@@@@@@
----------------------------
if 条件测试1 ; then
命令序列1
elif 条件测试2; then
命令序列2
elif ....
.......
else
命令序列n
if
----------------------------
**********************************************************************
循环操作***********for循环语句
**********************************************************************
@@@@@@@@@@@@@@@@
for循环
@@@@@@@@@@@@@@@@
------------------------------
for 收件人 in 邮件地址列表
do
发送邮件
done
------------------------------
例子:
------------------------------------------------------------
#!/bin/bash
#输出三条文字信息:每一天中的morning noon evening
for TM in "Morning" "Noon" "Evening"
do
echo "This is the $TM of the day"
done
-------------------------------------------------------------
@@@@@@@@@@@@@
while循环
@@@@@@@@@@@@@
--------------------------
while 可用内存<100MB
do
获取可用内存数
done
--------------------------
例子:
-------------------------------------------------------------------
#!/bin/bash
#批量增加20个系统用户user1.user2.--user4
i=1
while [ $i -le 4 ]
do
useradd user$i
echo "qwerasdf" | passwd -stdin user$i &> /dev/null
#-stdin意思为标准输入 standard in
i=`expr $i + 1`
done
-------------------------------------------------------------------
@@@@@@@@@@@@@@@@
case多重分支语句
@@@@@@@@@@@@@@@@
-----------------------
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
...........
*)
默认执行的命令序列
esac
----------------------
例子:
----------------------------------------------------------------
#!/bin/bash
read -p "start or stop?:" READ
#读入变量READ#
case $READ in
start)
echo "STARTing............"
;;
stop)
echo "STOPing.............."
;;
*)
echo "just START or STOP !!!"
;;
esac
----------------------------------------------------------------
@@@@@@@@@@@@@@@@
until循环语句
@@@@@@@@@@@@@@@@
直到。。。为止,就不再执行
---------------------
until 条件测试命令
do
命令序列
done
---------------------
@@@@@@@@@@@@@@@@@@
shift迁移语句
@@@@@@@@@@@@@@@@@@
变量取值向左移动
@@@@@@@@@@@@@@@@@@@
循环控制语句break,continue
@@@@@@@@@@@@@@@@@@@
----------------------------
while 命令
do
.........
.........
break(continue)
.........
.........
done
.........
----------------------------
break为中断循环,继续下面命令
continue为跳过此次循环
@@@@@@@@@@@@@@@@@@@@
shell函数应用
@@@@@@@@@@@@@@@@@@@@
-----------------
函数名() {
命令序列
}
-----------------
例子:
-----------------------------
#!/bin/bash
adder() {
echo `expr $1 + $2`
}
adder 12 34
adder 11 22
-----------------------------
shell编程完。。。。。。。。。。。。。。。