① shell脚本编程
2018-04-24 本文已影响8人
fe8478c7ba2a
程序
语言
编程
语言
自然语言
汉语 英语
计算机语言
低级语言 高级语言
0 1
汇编
c c++
java php python oc swift shell(bash)
编译型
c c++ java
解释型
php python bash
shell的定义
Shell 是命令解释器
Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功能很强、代码简短的程序
shell的分类和更改:
# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
#chsh –l //了解
#ls /bin/*sh
默认shell: bash
注意:各种脚本里凡是/bin/sh表示的是使用默认bash
查看当前使用的shell:
#echo $SEHLL
shell 的更改:
#chsh //了解
#vim /etc/passwd
适用范围:
什么时候不适合使用Shell编程:
1. 资源紧张的项目,特别是那些速度是重要因素的地方(排序,散序,等等)
2. 程序要进行很复杂的数学计算,特别是浮点计算,任意精度的计算,或者是复数计算
3. 要求交叉编译平台的可移植性(使用C或者是Java代替)
4. 需要结构化编程的复杂应用(需要变量类型检查和函数原型等等)
5. 对于影响系统全局性的关键任务应用。
6. 安全非常重要。你必须保证系统完整性和抵抗入侵,攻击和恶意破坏。
7. 项目由连串的依赖的各个部分组成。
8. 多种文件操作要求(Bash被限制成文件顺序存取,并且是以相当笨拙,效率低下的逐行的存取方式)
9. 需要良好的多维数组支持。
10. 需要类似链表或树这样的数据结构。
11. 需要产生或操作图象或图形用户界面。
12. 需要直接存取系统硬件。
13. 需要端口号或是socket I/O。
14. 需要使用可重用的函数库或接口。
15. 所有的私有的不开源的应用程序(Shell脚本的源代码是直接可读,能被所有人看到的)
如果你需要有上面的任意一种应用,请考虑其他的更强大的脚本语言――Perl,Tcl,Python,Ruby,或者可能是其他更高级的编译型语言,例如C,C++或者是Java
Shell 能做什么?
1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
9. 自动化扩容(增加云主机——>业务上线)
zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
11. Shell可以做任何事(一切取决于业务需求)
实例:
#vim cleanup.sh
#!/bin/bash
#清空/var/log目录下的日志文件的脚本实例
LOG_DIR=/var/log
ROOT_UID=0 # 只有用户ID变量$UID值为0的用户才有root权限.
LINES=50 # 默认的行数
E_XCD=66 # 不能进入到目录时的退出代码值
E_NOTROOT=67 # 不是root用户时退出的代码值
# 必须以root用户运行,以下进行检测
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root to run this script."
exit $E_NOTROOT
fi
# 测试是否提供了命令行参数(即是测试命令行参数至少有一个参数)
if [ -n "$1" ]
then
lines=$1
else
lines=$LINES # Default, if not specified on command line.
fi
#下面是一种更好的检测命令行参数的方法
# E_WRONGARGS=65 # 不是数字参数 (参数格式不对)时的退出码
# case "$1" in
# "" ) lines=50;;
# *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
# * ) lines=$1;;
# esac
cd $LOG_DIR
if [ `pwd` != "$LOG_DIR" ] # 也可以用 if [ "$PWD" != "$LOG_DIR" ]
# 如果工作目录不在/var/log里?
then
echo "Can't change to $LOG_DIR."
exit $E_XCD
fi #在操作清空日志文件之前再次检查是否在正确的目录里
# 可以像下面再次确定是否在正确的目录里:
# cd /var/log || {
# echo "Cannot change to necessary directory."
# exit $E_XCD;
# }
tail -$lines messages > mesg.temp # 保存message日志文件最后面几行日志信息到临时文件.
mv mesg.temp messages # 然后用临时文件覆盖messages日志文件
# cat /dev/null > messages
#上面这句把messages日志文件全部清空,这样没有上面那样保留最后几行安全
cat /dev/null > wtmp # ': > wtmp' and '> wtmp' have the same effect.
echo "Logs cleaned up."
exit 0
#一个脚本以0为退出代码表明脚本执行成功.