本章节比较重要
判断用户的参数,就是对象是啥
-d 目录
-e 文件是否存在,测试用的
-f 判断是否为一般文件
例子:
[ -d /home ]
echo $?
0or1
0标识存在,1标识不存在

&& :与
||:当前面错误则输出后面的内容
!:取反 正取反=反
[ ! $USER = root ] && echo "user" || echo "root"
USER:这是一个变量。显示当前用户
1:标识-root
2:1正确就输出user
3:前面错误,就输出root
root用户执行>root
linux执行>user

比较运算符
eq =
gt >
lt <
ge >=
le <=
ne not eq 不等于
例子
FM=free - m | grep Mem: | awk '{print $4}'
FM赋值为当前内存可用空间大小
[ $FM -lt 1024 ] && echo "内存不足1024M"

字符串比较
= 相同
!=不相同
-z 判断字符串内容是否为空

if条件语句
if;then;elif;else;fi
类似C
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null 输出到黑洞
$1 标识后面跟的第一个参数值
#!/bin/bash
echo "$0"
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is on-line"
else
echo "not-online"
fi

[root@linux ~]# sh chkhost.sh 127.0.0.1
chkhost.sh
host 127.0.0.1 is on-line

参数说明
read 读取用户输入的参数值并赋值到某个单位
-p 用于向用户显示的字符串

[root@linux ~]# cat chkscore.sh
read -p "输入你的成绩:" x
if [ $x -ge 85 ] && [ $x -le 100 ] ;
then
echo "great";
elif [ $x -ge 60 ] && [ $x -lt 85 ] ;
then echo "pass";
elif [ $x -eq 66 ]
then
echo "66666666";
else
echo "fail"
fi
-------;注意最好写完一个命令后用;隔离

[root@linux ~]# cat users.txt
tt
yy
[root@linux ~]# cat uu.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in cat users.txt UNAME的变量为users.txt里面的值
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done

--------;
[root@linux ~]# vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12
[root@linux ~]# vim CheckHosts.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
[root@linux ~]# ./CheckHosts.sh
Host 192.168.10.10 is On-line.
Host 192.168.10.11 is Off-line.
Host 192.168.10.12 is Off-line.
可以写一个IP地址探测工具。嗯
也可以写端口探测工具。想想还有点小激动
;;;;;分割
while语句
[root@linux ~]# cat Guess.sh
#!/bin/bash
Price=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格在0-999之间。猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++ 类似C
if [ $INT -eq $Price ] ; then
echo "恭喜您答对了,实际价格是$Price"
echo "您总共猜测了$TIMES次"
exit 0
elif [ $INT -gt $Price ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
;;;;
case条件语句
[root@linux ~]# cat Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母"
;;
[0-9])
echo "您输入的是 数字"
;;
*)
echo "您输入的是空格、功能键或者其他控制字符"
esac
;;;;;
计划任务

这个用的比较多
口诀
分 时 日 月 星期 命令
小时是24制
日和星期不能同时使用,会冲突
crontab -e 编辑
-l 显示计划任务

TIME=date "+%Y-%m-%d-%H:%M:%S-%j"
uptime > uptime$TIME.txt
5,15,30 uptime > uptime$TIME.txt
每隔5分钟,15分钟,30分钟进行一次uptime并输出到uptime$TIME.txt
[root@linux ~]# ll -t
total 76
-rw-r--r-- 1 root root 68 Jul 13 22:11 uptime2019-07-13-22:08:33-194.txt
-rw-r--r-- 1 root root 68 Jul 13 22:09 2019-07-13-22:08:33-194.time
-rw-r--r-- 1 root root 0 Jul 13 22:08 2019-07-13-22:08:33-194
上面是错误的,只能自己用命令输出。
在crontab里面不能输出,只会输出uptime.txt
正确用法:
* * * * * /usr/bin/uptime >> /root/uptime_$(date +\%Y\%m\%d).txt
只能输出到日,后面我在研究研究。