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
相關文章
相關標籤/搜索