Linux笔记06(Shell脚本学习)

代码格式有问题,再加上英文单词看不懂……大量的时间浪费在排错上面了……
主要出错位置:while中嵌套if忘记写than了……shell

bash解释器 与shell脚本(二)+计划任务(at+crontab)

备注:根据我我的习惯,我统一在后缀.sh脚本文件中执行:vim

chmod 700 XXX.sh

1、流程控制语句if

一般脚本都是从上至下一股脑的执行,效率是效率,但一旦某条命令执行失败了,那后面的功能全都会受到影响。 bash

(1)单分支if

if  条件测试操做

then    命令序列1

else    命令序列2

fi
练习:判断目录是否存在

存在不新建目录markdown

不存在新建目录app

[root@mmx ~]# clear
[root@mmx ~]# cat a.sh 
#!/bin/bash
DIR="/root/nice"

if [ ! -d $DIR ]
then
    mkdir -p $DIR
fi
[root@mmx ~]# ./a.sh 
[root@mmx ~]# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures   Videos
a.sh             Downloads  Music                 Public
Desktop          happy.txt  nice                  Templates

(2)多分支if

if  条件测试操做1

then    命令序列1

elif    条件测试操做2

then    命令序列2

else

        命令序列3

fi
练习1:判断主机在线状况

Host IP:XXX is on-lineide

Host IP:XXX is off-line测试

[root@mmx ~]# cat b.sh 
#!/bin/bash
ping -c 3 -i 0.01 -w 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
    echo "Host $1 is on-line"
else
    echo "Host $1 is off-line"
fi
[root@mmx ~]# ./b.sh 192.168.0.1
Host 192.168.0.1 is on-line
[root@mmx ~]# ./b.sh 192.168.0.51
Host 192.168.0.51 is off-line
[root@mmx ~]#
练习2:成绩判断

(优秀,良好,及格,不及格,错误)code

[root@mmx ~]# cat c.sh 
#!/bin/bash

read -p "请输入你的成绩:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then 
    echo " 成绩$GRADE良好 "
elif
    [ $GRADE -ge 60 ] && [ $GRADE -le 85 ]
then 
    echo " 成绩$GRADE及格 "
elif
    [ $GRADE -ge 0 ] && [ $GRADE -le 100 ]
then 
    echo " 成绩$GRADE不及格 "
else
    echo "成绩$GRADE超出范围"
fi
[root@mmx ~]# ./c.sh 
请输入你的成绩:1001
成绩1001超出范围
[root@mmx ~]# ./c.sh 
请输入你的成绩:75
 成绩75及格 
[root@mmx ~]# ./c.sh 
请输入你的成绩:30
 成绩30不及格

2、条件循环语句 for&while

for:肯定次数循环游戏

while:不肯定次数循环crontab

(1)for语句:

for 变量名 in  取值列表

do

    命令序列

done

练习:循环批量建立用户

分析:

一、用户名表

二、批量设置密码或密码对应表

三、bash脚本中读取与写入密码

四、执行脚本

[root@mmx Desktop]# ls
a.sh  users.txt
一、建立users用户列表
[root@mmx Desktop]# cat users.txt 
mmx
xxm
xiaoming
xiaomingtongxue
二、编写for代码
[root@mmx Desktop]# cat a.sh 
#!/bin/bash

# for循环

read -p "Enter The Users Password: " PASSWD
for UNAME in `cat users.txt`
do
    id $UNAME &> /dev/null
    if [ $? -eq 0 ]
    # 若是为真
​   then
​       echo "$UNAME,Already exists"
​   else
​       useradd $UNAME &> /dev/null
​       echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
​       echo "$UNAME,Create success"
​   fi
done
三、代码执行,查看结果
[root@mmx Desktop]# ./a.sh 
Enter The Users Password: 123
mmx,Already exists
xxm,Create success
xiaoming,Create success
xiaomingtongxue,Create success

练习2:判断主机在线状况

分析:

一、IP地址表

二、判断是否能ping通(ping通返回结果0-在线,ping不通返回结果1-不在线)

三、编写脚本

四、执行脚本

一、填写须要查询主机在线状况IP地址

[root@mmx ~]# cat /root/Desktop/host_ip.txt 
127.0.0.1
192.168.0.20
114.114.114.114
12.41.21.3

二、编写bash脚本

[root@mmx ~]# cat host_link.sh 
#!/bin/bash

HLIST=$(cat /root/Desktop/host_ip.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@mmx ~]# ./host_link.sh 
Host 127.0.0.1 is On-line.
Host 192.168.0.20 is On-line.
Host 114.114.114.114 is On-line.
Host 12.41.21.3 is Off-line.

(2)while语句:

while   条件测试语句

do

    命令序列

done

练习:猜数字游戏

分析:

一、随机数$RANDOM % 1000 保证1000之内

二、TIMES计数器

三、猜想提示高低

一、编写脚本
[root@mmx ~]# cat guess.sh 
#!/bin/bash

PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "请输入商品实际价格0~999" 
while true
do
    read -p "请输入猜想的商品价格:" INT
    let TIMES++
    if [ $INT -eq $PRICE ]
    then
        echo "恭喜您猜对了,实际价格是:$PRICE"
        echo "您猜想次数为:$TIMES"
        exit
    elif [ $INT -gt $PRICE ]
    then    
        echo "过高了"
    else
        echo "过低了"
    fi
done
二、执行测试
[root@mmx ~]# ./guess.sh 
请输入商品实际价格0~999
请输入猜想的商品价格:500
过高了
请输入猜想的商品价格:250
过低了
请输入猜想的商品价格:375
过高了
请输入猜想的商品价格:300
过高了
请输入猜想的商品价格:275
过高了
请输入猜想的商品价格:255
恭喜您猜对了,实际价格是:255
您猜想次数为:6

3、计划任务

计划任务分为一次性计划任务与长期性计划任务

(1)at一次性任务

练习:指定时间重启

[root@mmx ~]# at 22:39
warning: commands will be executed using /bin/sh
at> reboot
at> <EOT>
job 1 at Sat Jul  3 22:39:00 2021
参数 做用
-f 指定包含命令的任务文件
-q 指定新任务名称
-l 显示待执行任务列表
-d 删除指定待执行任务
-m 任务执行后给用户发邮件

注意:本机时间必定要正确!!!

练习2:管道符方式

[root@mmx ~]# echo "nice to me to!" > mmx.txt | at 22:48

[root@mmx ~]# ls
anaconda-ks.cfg  Desktop  Documents  Downloads  guess.sh  mmx.txt  Music  original-ks.cfg  Pictures  Public  Templates  Videos

(2)crontab周期性任务

注意:一共两组参数

第一组:分、时、日、月、星期(分钟必须写,日和星期只能写一个)

第二组:命令,命令须要写详细地址,whereis查看

参数 做用
-e 编辑计划任务
-u 指定用户名称
-l 列出任务列表
-r 删除计划任务
练习:周期性执行某命令
[root@mmx ~]# crontab -l
*/1 * * * *  /usr/bin/ls -al > mmx.txt
# 分时日月星期,分钟必须写,*/1表明每分钟执行一次
[root@mmx ~]# cat mmx.txt 
total 72
dr-xr-x---. 15 root root  4096 Jul  3 22:47 .
dr-xr-xr-x. 17 root root   224 Jul  3 11:07 ..
-rw-------.  1 root root  2632 Jul  3 11:13 anaconda-ks.cfg
-rw-------.  1 root root  2969 Jul  3 07:44 .bash_history
-rw-r--r--.  1 root root    18 Aug 12  2018 .bash_logout
-rw-r--r--.  1 root root   176 Aug 12  2018 .bash_profile
-rw-r--r--.  1 root root   176 Aug 12  2018 .bashrc
drwx------. 11 root root   244 Jul  3 03:17 .cache
drwx------. 13 root root   241 Jul  3 22:53 .config
-rw-r--r--.  1 root root   100 Aug 12  2018 .cshrc
drwxr-xr-x.  2 root root   115 Jul  3 07:05 Desktop
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Documents
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Downloads
-rw-------.  1 root root    16 Jul  3 11:14 .esd_auth
-rwxr-xr-x.  1 root root   378 Jul  3 07:29 guess.sh
-rw-------.  1 root root   620 Jul  3 03:17 .ICEauthority
drwx------.  3 root root    19 Jul  3 11:14 .local
-rw-r--r--.  1 root root     0 Jul  3 23:01 mmx.txt
drwx------.  5 root root    66 Jul  3 03:17 .mozilla
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Music
-rw-------.  1 root root  2053 Jul  3 11:13 original-ks.cfg
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Pictures
drwxr-----.  3 root root    19 Jul  3 11:14 .pki
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Public
-rw-r--r--.  1 root root   129 Aug 12  2018 .tcshrc
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Templates
drwxr-xr-x.  2 root root     6 Jul  3 11:14 Videos
-rw-------.  1 root root 20272 Jul  3 07:29 .viminfo
-rw-------.  1 root root   281 Jul  3 07:45 .Xauthority
相关文章
相关标签/搜索