@mrz1
2017-12-04T00:42:37.000000Z
字数 9345
阅读 783
笔记
-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大于等于整数2
test 整数1 -gt 整数2 #整数1大于整数2
test 整数1 -le 整数2 #整数1小于等于整数2
test 整数1 -lt 整数2 #整数1小于整数2
test 整数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 false
true
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/passwd
0
[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 2
ping -c1 -w1 $1 &> /dev/null && echo "ping successful" || echo "ping failed"
运行结果:
[root@centos7 ~]#./houstping.sh 47.93.96.256
ping failed
[root@centos7 ~]#./houstping.sh 47.93.96.29
ping 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| hea
d -1`
[ "$dist" -gt 10 ] && wall "disk will be full"
运行结果:
[root@centos7 ~]#./dist.sh
Broadcast 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 "ino
de利用率为"$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.sh
16 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 "请输入头:" head
read -p "请输入脚:" foot
c=$[( foot - head*2 ) /2 ]
r=$[ head - $c ]
echo "兔子:$c"
echo "鸡: $r"
脚本1:
#! /bin/bash
# -----------------------------------------
# Filename: yesno.sh
......省略
# ------------------------------------------
read -p "yes or no: " yn
yn=$(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 enter
wrong" && exit 3
输出结果:
[root@centos7 ~]#./yesno.sh
yes or no: no
no
you enter no
[root@centos7 ~]#./yesno.sh
yes or no: yes
yes
you enter yes
[root@centos7 ~]#./yesno.sh
yes or no: asd
asd
you enter wrong
脚本2:
[root@centos7 ~]#yn=n;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
true
[root@centos7 ~]#yn=y;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
true
[root@centos7 ~]#yn=Y;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
true
[root@centos7 ~]#yn=N;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
true
[root@centos7 ~]#yn=Yn;[[ "$yn" =~ ^[Yy]([eE][sS])?$|^[Nn][oO]?$ ]] && echo true
把命令行分成单个命令词
反斜线(\)会使随后的字符按原意解释
[root@centos7 ~]# echo Your cost: \$5.00
Your 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.sh
echo -e "\033[1;5;31;42mHi,dangerous!\033[0m"
#! /bin/bash
cat <<_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 $1
vim + $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.png
find -iname snow.png
find / -name “*.txt”
find /var –name “*log*”
find -user joe -group joe
find -user joe -not -group joe
find -user joe -o -user jane
find -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