shell脚本
简介:
使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点是:它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,Shell脚本只要“用心写”一次,即可应用到很多系统上。因此,之所以要使用Shell脚本是基于: 简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。 开发容易:可以在短时间内完成一个功能强大又妤用的脚本。
编程基础:
-
程序:指令+数据
-
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
-
shell程序:提供了编程能力,解释执行
程序的执行方式:
-
计算机:运行二进制指令;
-
编程语言:
低级:汇编
高级:
编译:高级语言–>编译器–>目标代码 如:java,C#
解释:高级语言–>解释器–>机器代码 如:shell, perl, python
编程基本概念
-
编程逻辑处理方式:
顺序执行 (一步一步执行)
循环执行 (循环重复一种命令直到条件满足退出循环)
选择执行 (条件判断悬着执行某些命令)
-
shell编程:过程式、解释执行
编程语言的基本结构:
数据存储:变量、数组
表达式: a + b
语句:if
shell脚本基础
shell脚本是包含一些命令或声明,并符合一定格式的文 本文件
格式要求:首行shebang机制 #!/bin/bash
创建shell脚本
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#! 如:#!/bin/bash
添加注释 注释以#开头
第二步:运行脚本
给予执行权限
脚本调试
bash -n /path/to/some_script 检测脚本中的语法错误
bash -x /path/to/some_script 调试执行
变量
-
变量:命名的内存空间
-
作用:
1、数据存储格式
2、参与的运算
3、表示的数据范围 类型: 字符 数值:整型、浮点型
-
变量命名法则:
1、不能使程序中的保留字:例如if, for;
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
1、本地变量
变量赋值:name=‘value’,
可以使用引用value:
(1) 可以是直接字串; name=“root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
变量引用:${name}, $name
"":弱引用,其中的变量引用会被替换为变量值
'':强引用,其中的变量引用不会被替换为变量值,而保 持原字符串
显示已定义的所有变量:set
删除变量:unset name
2、环境变量
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:
export
env
printenv
删除:unset name
bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
3、位置变量
shell脚本之位置变量:
$0 脚本的名称
$1,$2,$3…. 第一个参数,第二个参数,第三个参数
shift 每shift一次,参数位置往前一个($2–>$1,$3—>2,…)
shift N 往前的移动是N个
shell脚本之特殊变量:
$? 上一次执行的状态码
$# 参数个数
$* 参数列表
$@ 参数列表
脚本:
验证位置变量和特殊变量:
#!/bin/bash
echo $0 命令本身
echo "the number of values is $#" 脚本参数个数
echo $* 脚本参数列表
echo $@ 脚本参数列表
echo $1 第一个参数
echo $3 第三个参数
脚本
执行结果
[root@localhost ~]# /testdir/bin/ceshi.sh 1 2 3 4 5
/testdir/bin/ceshi.sh $0,命令本身
5 参数个数
1 2 3 4 5 参数列表并作为一个字符串,所以这个结果只有一个参数了
1 2 3 4 5 参数列表并每个参数独立出来,所以这个结果还是有五个字符串
1 第一个参数
3 第三个参数
作业实例:
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
主机名:hostname
IPv4地址:ifconfig | grep 'inet\b' | grep -v '127.0.0.1' | tr -s ' ' | cut -d' ' -f3
操作系统版本:cat /etc/redhat-release
内核版本:uname -r
CPU型号:lscpu | grep -i "型号名称:"
内存大小:free -h | sed -n '2p' | tr -s ' ' | cut -d' ' -f2
硬盘大小:fdisk -l|sed -n '2p'|cut -dG -f1|grep -o [[:digit:]].*\.
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
备份至目:/root/etc$(date +%F)
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
显示当前硬盘分区中空间利用率最大的值:df | grep '/dev/sd' | tr -s ' ' | sort -nr -t' ' -k5 | head -1 | cut -d' ' -f5
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
显示并排序netstat -nt | tr -s ' ' | cut -d' ' -f5 | tr -cs '0-9.' '\n' | egrep '([0-9]+.){3}[0-9]+' | sort | uniq -c | sort -nr | tr -s ' ' '\t'
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
切出uid并做加法
显示出来
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
取两个文件内的空行数并做加法
6、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
统计/etc, /var, /usr目录中共有多少个一级子目录和文件
总数
7、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
8、写一个
脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
9、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写
10、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
11、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
12、计算1+2+3+…+100的值
13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
原创文章,作者:502795641,如若转载,请注明出处:http://www.178linux.com/35451
评论列表(1条)
文章整体思路清晰,排版精美,内容充实饱满