shell脚本编程初步
随着课程学习的深入,我们已经学习了一些常用的命令,会去解决了一部分简单的问题,但是这不能满足复杂的工作,它可以帮助我执行自动化的常用命令、执行系统管理和故障排除、创建简单的应用程序、处理文本或文件。所以我们开始了shell脚本的编程,帮助我们更好的去完成工作。简单地说,shell编程相当于帮我们之前学习的许多命令进行了深度的结合。
一、shell脚本基础界面
shell脚本是包含一些命令或声明,并符合一定格式的文本
格式要求:首行shebang机制
如:#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
我们打开一个脚本查看一下,例如打开/root/bin/AandB.sh
第1行:定义shebang机制(一般必须有);
第2行:为本脚本添加的备注与相关描述(可有可无,建议养成好的习惯);
第3行:命令行的书写,可以书写多行。但是要代码数量尽量简洁。
二、脚本的调试命令
我们可以通过使用bash -n /path/to/some_script去检测脚本中的语法错误。还可以通过bash -x /path/to/some_script进行调试执行。
三、脚本中的几种变量
1、本地变量
(1)变量的赋值:
name=’value’;echo $name 可以显示出value
value可以是直接字串; name=“root"
value变量引用:name="$USER"
value命令引用:name=` COMMAND `, name =$(COMMAND)
(2)生效范围:当前shell进程;
无效范围: 对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程均无效。
(3)变量的定义与删除
显示定义的所有变量:set.
删除变量:unset name
由于定义的变量会占用服务器的内存,所以使用完一个变量后要及时删除。
2、环境变量:
(1)生效范围:当前shell进程及其子进程。
(2)变量声明:
export name =VALUE
declare -x name =VALUE
(3)变量引用:$name, ${name}
(4) 显示所有环境变量:
export
env
printenv
删除:unset name
(5)bash 有许多内建的环境变量:PATH, SHELL, USRE,UID,
HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
3、局部变量:
当前shell进程中某代码片段(通常指函数)
4、位置变量:
$1,$2,…来表示,用于用于让脚本在脚本代码中调用通过命令行传递给它的参数
5、特殊变量:
$0:命令本身
$*:传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
四、bash 中的算术运算:
+, -, *, /, % 取模(取余), ** (乘方)
实现算术运算:
(1) let var= 算术表达式
(2) var=$[ 算术表达式]
(3) var=$(( 算术表达式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var = 数值
(6) echo ‘ 算术表达式’ | bc
乘法符号有些场景中需要转义 ,如 如*
bash 有内建的随机数生成器:$RANDOM (1-32767)
echo $[$RANDOM%50] :0-49 之间随机数
赋值
增强型赋值:+=, -=, *=, /=, %=
例如:let count+=3
自加3 后自赋值
自增,自减:
let var+=1
let var++
let var-=1
let var–
五、一些命令的复习
1、显示磁盘分区情况
2、使用export查看环境变量
3、在脚本代码中调用通过命令行传递给脚本的参数
vim /root/bin/arg.sh 编辑命令如下
然后将参数传给这个可执行的文件
0810课题练习作业
1、编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,IPv4 地址,操作系统版本,内核版本,CPU 型号,内存大小,硬盘大小。
答:先把每条命令写出来,然后再写入脚本之中。
显示主机名:hostname
IPv4地址:ifconfig|sed -n "2p"|tr -s " " ":"|cut -d: -f3
操作系统版本:cat /etc/system-release
内核版本:uname -r
cpu型号:lscpu|grep "Model name"|cut -d: -f2|sed -r 's@^[[:space:]]{2,}\b@@'
内存大小:free -m|sed -n "2p"|tr -s " " ":"|cut -d: -f2
硬盘大小:fdisk -l|grep "sda\b"|cut -d, -f1|cut -d: -f2
然后在脚本中进行编辑
显示结果如下:
2 、编写脚本/root/bin/backup.sh ,可实现每日将/etc/ 目录
备份到/root/etcYYYY-mm-dd中。
答: cp -a /etc/ /root/ etc`date +%F`
3 、编写脚本/root/bin/disk.sh, 显示当前硬盘分区中空间利
用率最大的值
答:df |grep "sd"|sort -n|head -n 1|tr -s " " ":"|cut -d: -f5
4 、编写脚本/root/bin/links.sh, 显示正连接本主机的每个远
程主机的IPv4。
答:netstat -nt|tr -s " " ":"|cut -d: -f6|grep "[0-9]"
5、写一个脚本/root/bin/sumid.sh ,计算/etc/passwd
文件中的第10 个用户和第20 用户的ID 之和。
答:先想好如何提取第10个和第20个用户的ID号。
之后编辑如下的脚本
6、写一个脚本/root/bin/sumspace.sh ,传递两个文件
路径作为参数给脚本,计算这两个文件中所有空白行之和。
答:本题涉及传参数和查找文件空白行。两步完成组合即可得到想要结果。
答:在vim编辑脚本要注意针对命令,应该使用`,反向单引号。避免使用双引号出现错误。
之后在执行命令是传入参数即可。
7、写一个脚本/root/bin/sumfile.sh, 统计/etc, /var,
/usr目录中共有多少个一级子目录和文件
答:首先,要做好每个目录中的目录和文件的数量统计,之后编辑文本并传入参数即可。这样比较灵活,注意脚本编辑尽量具有通用性,不要”写死了“。
8 、写一个脚本/root/bin/argsnum.sh ,接受一个文件路径作
为参数;如果参数个数小于1 ,则提示用户“至少应该给一个
参数”,并立即退出;如果参数个数不小于1 ,则显示第一个
参数所指向的文件中的空白行数.
答:给定参数,利用比较命令做判断
9、写一个脚本/root/bin/hostping.sh ,接受一个主机的
IPv4 地址做为参数,测试是否可连通。如果能ping 通,则提
示用户“该IP 地址可访问” ;如果不可ping 通,则提示用户“
该 该IP 地址不可访问”
答:
10、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满。
答:为了简化代码,我将inode和磁盘分区的大小全部显示,当某一数值大于规定值即可发出邮件。
diskorinode=`df|(df;df -i)|grep "sda"|tr -s " " ":" |cut -d: -f5|grep -o "[[:digit:]]\+"|sort -nr|head -n 1`
[ "$diskorinode" -ge 70 ] && echo "the systems disk or inode run out pls check" | mail -s "Waring" root
如下为邮件的详情
11、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限。
答:通过对基名的判断来确认是否是符合条件的文件。
12、判断输入的IP是否为合法IP
答:#!/bin/bash
read -p "pls input one ipaddress:" ipadr
echo $ipadr|grep -E "^(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$" &> /dev/null && echo " this is a legal IP" || echo "this is not a legal IP"
13、计算1+2+3+…+100
答:
14、输入起始值A和最后值B,计算从A+(A+1)…+(B-1)+B的总和
答:seq -s “+” 1 100|bc
原创文章,作者:178babyhanggege,如若转载,请注明出处:http://www.178linux.com/34922
评论列表(1条)
心态上干劲十足,学习中认真踏实,博客作业完成的还不错。