感悟 :
经过对文本处理工具grep,sed等内容的,以及vim文本编辑器的学习,马不停蹄的又进行了对shell脚本的学习。对shell脚本的认识是可以保存在本地,用的时候只要执行相关脚本,简短的命令就可以完成操作,可以用来应对日常重复性工作,有效提高系统管理员的效率,避免在重复性工作上花费不必要的时间。
*************************************************************************************
shell脚本的用途有:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或者文件
示例
#!/bin/bash
#author:LH
#Version:1.0
#Description:This script displays some imformation about your system.
脚本编辑完成后,需要进行几个步骤,确保可以正确执行
1.chmod +x script或 bash script
2.bash -n script 检查脚本中语法错误
3.bash -x 调试执行,按照脚本顺序
变量 :实际就是命名的内存空间
编程语言分类
强类型 :定义变量时要指定类型,java,python等
弱类型 :无需提前指定类型,可直接调用
变量命名规则:
不能使用和保留字相同的名字
只能使用数字字母下划线,数字不可开头
见名知意
驼峰命名法:大小驼峰
变量种类
1.本地变量 作用范围为当前shell进程,对其他进程,以及子shell无效
2.环境变量 作用范围是当前shell及其子进程
3.局部变量 作用范围为当前shell某段(一般是函数)
4.位置变量 $1 $2 $3 …用于让脚本在脚本代码中调用传入的参数
5 特殊变量
$? 上次命令执行状态
$0 在脚本内部引用脚本名称本身
$# 传递给当前脚本的参数的个数
*************
$* 和$@:表面的意思相同,都是表示传递给当前脚本的所有参数
区别:
$* 把所有参数看做一条字符串
$@ 所有参数让当做单独的字符串
引用方式
变量引用 name="$USER",不可使用''
命令引用 name=`CMD` =$(CMD)
显示所有变量 set
删除变量 :unset name ,通常用于脚本末尾,释放变量的命名空间,有利于内存合理使用
*********************************************
环境变量声明、赋值
ecport name=value
declare -x name=VALUE
引用方式和本地变量相同
显示所有环境变量:
export
env
printenv
删除变量:unset name
bash 的内置环境变量
PATH 环境变量
SHELL
USER 当前用户
UID 当前用户UID
HISTSIZE 历史命令保存数目
HOME
PWD 当前目录
OLDPWD 前一个目录
HISTFILE 历史文件路径
PS1
PPID 父目录
只读变量:只能读,但不能修改删除
》》》》》》》》》》》》》》》》》》》》》》
算数运算
** 乘方
实现
1.、let var=2+8 –>echo $var
2. echo '2+8'|bc
3. echo $[$RANDOM%50] 0-49间随机数
赋值
let var++ 先赋值,再运算
let ++var 先运算,再赋值
+=自加,-=,*=,/= %=
逻辑运算:
与:都为1时,才为1
或:都为0时,才为0
短路运算:
与
或
异或
相同为假,相同为真
聚集命令,就是;连接,然后按照从左至右顺序一个一个运行
条件性的执行操作符
&& – -AND THEN
|| – -OR ELSE
$ grep -q no_such_user /etc/passwd \
|| echo 'No such user' \为换行执行
*************************
数值测试
-gt
-ge
-lt
-le
-ne 是否不等于
-eq 是否等于
字符串测试
> ASCLL 是否大于
'string'=~ /pattern/ 左侧字符串是否被右侧PATTErn匹配到
-z "string" 字符串是否为空,空为真,不空为假
-n 与-z相反
文件测试
-e -a 文件存在为真,否为假
-L 是否存在且为符号链接文件
-p 管道文件
-S 是否存在且为套接字文件
文件权限测试
-r
-w
-x 是否存在且可执行
特殊权限测试
-g sgid
-u 是否存在且拥有suid
-k 是否存在sticky权限
文件大小测试
-s FILE:是否存在且非空
文件是否打开
-t fd 表示文件描述符是否已经打开且与某终端相关
-N FILE:文件自上次读取之后是否被修改过
-O FILE 当前用户是否为文件属主
-G 是否为文件属组
双目测试:
FILE1 -ef FILE2:1和2是否指向同一个设备上的相同inode
组合条件测试
1.CMD1 && CMD 2 并且
CMD1 || CMD 2 或者
2.
-a 并且
-o 或者
必须使用测试命令 ,test
*************************************
*************************************
**********************************8**
练习
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
netstat -nt |tr -s ' '|cut -d' ' -f5|tr -cs '0-9.' '\n'|egrep '([0-9]+.){3}[0-9]+'|uniq -c|sort -nr|tr -s ' ' '\t'
2 172.18.19.48
1 10.1.250.94
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
echo `sed -n -e 10p -e 20p /etc/passwd|cut -d: -f3|tr '\n' +|sed -r 's@(.*)\+@\1@'`|bc
sed -n -e 10p -e 20p /etc/passwd
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
6、写一个脚本/root/bin/sumfile.sh,统计/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,实现禁止和充许普通用户登录系统。
[ -f /etc/nologin ] && echo "user disable login already" || (touch /etc/nologin; echo user disable login )
[ -f /etc/nologin ] && (rm -f /etc/nologin;echo user enable login) || echo user disable login already
11、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,
否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
12、计算1+2+3+…+100的值
13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
原创文章,作者:000,如若转载,请注明出处:http://www.178linux.com/34858