@mrz1
2017-12-04T00:42:37.000000Z
字数 9345
阅读 896
笔记
-a FILE:同-e-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件-c FILE:是否存在且为字符设备文件-d FILE:是否存在且为目录文件-f FILE:是否存在且为普通文件-h FILE 或-L FILE:存在且为符号链接文件-p FILE:是否存在且为命名管道文件-S FILE:是否存在且为套接字文件
-r FILE:是否存在且可读-w FILE: 是否存在且可写-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限-g FILE:是否存在且拥有sgid权限-k FILE:是否存在且拥有sticky权限
-s FILE: 是否存在且非空
-t fd: fd文件描述符是否在某终端已经打开-N FILE:文件自从上一次被读取之后是否被修改过-O FILE:当前有效用户是否为文件属主-G FILE:当前有效用户是否为文件属组
-z STRING 如果字符串为空,则为true。-n STRING STRING如果字符串不为空,则为真。-v VAR 特殊:里面变量不加$;变量VAR是否设置;设置为真;定义空为真
test 整数1 -eq 整数2 #整数相等test 整数1 -ge 整数2 #整数1大于等于整数2test 整数1 -gt 整数2 #整数1大于整数2test 整数1 -le 整数2 #整数1小于等于整数2test 整数1 -lt 整数2 #整数1小于整数2test 整数1 -ne 整数2 #整数1不等于整数2
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)FILE1 -ot FILE2: FILE1是否旧于FILE2
[root@centos7 ~]#ip="123.23.223.23";[[ "$ip" =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]] && echo true ||echo falsetrue
var=haha123 ; [[ "$var" =~ ^[0-9]+$ ]] && echo true || echo false
var=0123 ; [[ "$var" =~ ^0*[1-9][0-9]*$ ]] && echo true || echo false
mobile=12800138000 ;[[ "$mobile" =~ ^1[3456789][0-9]{9}$ ]] && echo true || echo false
1.写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
命令:
#! /bin/bash# ------------------------------------------# Filename: $1......省略# ------------------------------------------[ $# -lt 1 ] && echo "至少一个参数" && exit 20[ -e $1 ] && echo `grep -c '^$' $1` || echo "没有这样的文件或目录?"
执行结果:
[root@centos7 ~]# ./srgsnum.sh /etc/passwd0[root@centos7 ~]# ./srgsnum.sh至少一个参数
2.编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户"该IP地址不可访问"
#! /bin/bash# ------------------------------------------# Filename: houstping.sh...... //省略# ------------------------------------------[ $# -ne 1 ] && echo "please input one ip" && exit 2ping -c1 -w1 $1 &> /dev/null && echo "ping successful" || echo "ping failed"
运行结果:
[root@centos7 ~]#./houstping.sh 47.93.96.256ping failed[root@centos7 ~]#./houstping.sh 47.93.96.29ping successful
3. 编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
参考1:
#! /bin/bash# ------------------------------------------# Filename: dist.sh...... //省略# ------------------------------------------dist=`(df -i /dev/sd*;df /dev/sd*)|egrep -o '[0-9]+%' |egrep -o '[0-9]+'|sort -nr| head -1`[ "$dist" -gt 10 ] && wall "disk will be full"
运行结果:
[root@centos7 ~]#./dist.shBroadcast message from root@centos7.qifei.com (pts/1) (Sun Nov 26 13:33:05 2017):disk will be full
参考2:
#! /bin/bash# ------------------------------------------# Filename: dist.sh...... //省略# ------------------------------------------dist=`df |grep "/dev/sd" |grep -o '[0-9]*%' |grep -o '[0-9]*'|sort -nr| head -1`inode=`df -i |grep "/dev/sd" |egrep -o '[0-9]*%' |egrep -o '[0-9]*'|sort -nr| head -1`sum=80[ "$dist" -ge "$sum" ] && echo -e "磁盘空间占用率超过"$sum"\a `wall 'The disk space will be full' `"||echo ">磁盘利用率为"$dist",可以使用"[ "$inode" -ge "$sum" ] && echo -e "inode占用率超过"$sum"\a `wall 'The disk space will be full'`" ||echo "inode利用率为"$inode",可以使用"
运行结果:
[root@centos7 ~]#./dist.sh磁盘利用率为16,可以使用inode利用率为1,可以使用
参考3:
#! /bin/bash# ------------------------------------------# Filename: warning.sh...... //省略# ------------------------------------------echo `df |grep "/dev/sd" |grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" |sort -nr`
运行结果:
[root@centos7 ~]#./warning.sh16 8 1
[ ! \( -r "$1" -o -w "$1" \) ] && echo "不可读不可写"
touch /etc/nologin && echo "no" > /etc/nologin //禁止登陆
rm /etc/nologin //开启登陆
使用read来把输入值分配给一个或多个shell变量
-p 指定要显示的提示-s 静默输入,一般用于密码-n N 指定输入的字符长度N-d ‘字符’ 输入结束符-t N TIMEOUT为N秒read 从标准输入中读取值,给每个单词分配一个变量所有剩余单词都被分配给最后一个变量read -p "Enter a filename: " FILE
[root@centos7 ~]#cat checkdisk.sh#! /bin/bash# ------------------------------------------# Filename: checkdisk.sh......省略# ------------------------------------------echo "鸡兔同笼问题?"read -p "请输入头:" headread -p "请输入脚:" footc=$[( foot - head*2 ) /2 ]r=$[ head - $c ]echo "兔子:$c"echo "鸡: $r"
脚本1:
#! /bin/bash# -----------------------------------------# Filename: yesno.sh......省略# ------------------------------------------read -p "yes or no: " ynyn=$(echo $yn | tr "[:upper:]" "[:lower:]")echo $yn[ "$yn" = "yes" -o "$yn" = "y" ] && echo " you enter yes" && exit 1[ "$yn" = "no" -o "$yn" = "n" ] && echo "you enter no" && exit 2 || echo "you enterwrong" && exit 3
输出结果:
[root@centos7 ~]#./yesno.shyes or no: nonoyou enter no[root@centos7 ~]#./yesno.shyes or no: yesyesyou enter yes[root@centos7 ~]#./yesno.shyes or no: asdasdyou enter wrong
脚本2:
[root@centos7 ~]#yn=n;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo truetrue[root@centos7 ~]#yn=y;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo truetrue[root@centos7 ~]#yn=Y;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo truetrue[root@centos7 ~]#yn=N;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo truetrue[root@centos7 ~]#yn=Yn;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
把命令行分成单个命令词
反斜线(\)会使随后的字符按原意解释
[root@centos7 ~]# echo Your cost: \$5.00Your cost: $5.00
按生效范围划分,存在两类:
执行顺序:/etc/profile -->/etc/profile.d/*.sh -->
~/.bash_profile --> ~/.bashrc --> /etc/bashrc
执行顺序: ~/.bashrc --> /etc/bashrc -->/etc/profile.d/*.sh
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
修改profile和bashrc文件后需生效
两种方法:
1. 重新启动shell进程
2. 或source //是在当前变量中;bash是开了进程
例:
. ~/.bashrc
保存在~/.bash_logout文件中(用户)
在退出登录shell时运行
# ~/.bash_logout //里面可以写系统退出执行的命令
h:hashall,打开这个选项后,Shell 会将命令所在的路径
全局:/etc/profile, /etc/profile.d/*.sh
cdnet='cd /etc/sysconfig/network-scripts/'
editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
editnet='vim /etc/sysconfig/network-scripts/ifcfgeno16777736 或 ifcfg-ens33 ' (如果系统是CentOS7)
[root@centos7 ~]#vim /etc/profile.d/env.sh //定义颜色PS1="\[\e[1;35m\][\u@\h \W]\\$\[\e[0m\]"
echo -e "alias cdnet='cd /etc/sysconfig/network-scripts/'\n alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'\n alias editnet='vim /etc/sysconfig/network-scripts/ifcfgeno16777736'" >> ~/.bashrc
[root@centos7 ~]#vim /etc/profile.d/danger.shecho -e "\033[1;5;31;42mHi,dangerous!\033[0m"
#! /bin/bashcat <<_EOF_ > $1#! /bin/bash# ------------------------------------------# Filename: $1# Revision: 1.0# Date: `date +%F`# Author: Zhang Qi Fei# Email: 1353250703@qq.com# Website: www.zhangqifei.top# Description: This is the first script# ------------------------------------------_EOF_chmod +x $1vim + $1
loading......
在文件系统上查找符合条件的文件
文件查找:locate, find
非实时查找(数据库查找):locate
实时查找:find
1.查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb)
3.索引构建过程需要遍历整个根文件系统,极消耗资源
示例:
搜索名称或路径中带有"conf"的文件
locate conf
使用Regex来搜索以".conf"结尾的文件
locate -r '\.conf$'
实时查找工具,通过遍历指定路径完成文件查找
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
指搜索层级
-maxdepth level最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度
根据文件名和inode查找:
-name "文件名称":支持使用glob*, ?, [], [^]-iname "文件名称":不区分字母大小写-inum n 按inode号查找-samefile name 相同inode号的文件-links n 链接数为n的文件-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件-group GRPNAME: 查找属组为指定组(GID)的文件-uid UserID:查找属主为指定的UID号的文件-gid GroupID:查找属组为指定的GID号的文件-nouser:查找没有属主的文件-nogroup:查找没有属组的文件
根据文件类型查找:
-type TYPE:• f: 普通文件• d: 目录文件• l: 符号链接文件• s:套接字文件• b: 块设备文件• c: 字符设备文件• p: 管道文件
组合条件:
与:-a或:-o非:-not, !德·摩根定律:(非 A) 或 (非 B) = 非(A 且 B)(非 A) 且 (非 B) = 非(A 或 B)示例:!A -a !B = !(A -o B)!A -o !B = !(A -a B)
find示例
find -name snow.pngfind -iname snow.pngfind / -name “*.txt”find /var –name “*log*”find -user joe -group joefind -user joe -not -group joefind -user joe -o -user janefind -not \( -user joe -o -user jane \)find / -user joe -o -uid 500
找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls
排除目录示例:
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf"
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a -prune –o -name "*.conf"
-size [+|-]#UNIT常用单位:k, M, G,c(byte)#UNIT: (#-1, #]如:6k 表示(5k,6k]-#UNIT:[0,#-1]如:-6k 表示[0,5k]+#UNIT:(#,∞)如:+6k 表示(6k,∞)查找50-100M文件?find / -size +50M -size -101M
以"天"为单位;
-atime [+|-]#,#: [#,#+1)+#: [#+1,∞]-#: [0,#)-mtime-ctime以“分钟”为单位:-amin-mmin-cmin