學習筆記0615----shell腳本

預習內容

新的學習任務:
20.1 shell腳本介紹
20.2 shell腳本結構和執行
20.3 date命令用法
20.4 shell腳本中的變量
20.5 shell腳本中的邏輯判斷
20.6 文件目錄屬性判斷
20.7 if特殊用法
20.8/20.9 case判斷
20.10 for循環
20.11/20.12 while循環
20.13 break跳出循環
20.14 continue結束本次循環
20.15 exit退出整個腳本
擴展
select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html

1. shell腳本介紹

  • shell是一種腳本語言 和傳統的開發語言比較,會比較簡單
  • shell有自己的語法;可以使用邏輯判斷、循環等語法
  • 可以自定義函數,目的就是爲了減少重複的代碼
  • shell是系統命令的集合
  • shell腳本可以實現自動化運維,能大大增加我們的運維效率

2. shell腳本結構和執行

  • shell腳本結構

    • 開頭需要加#!/bin/bash
    • 以#開頭的行作爲解釋說明
    • 腳本的名字以.sh結尾,用於區分這是一個shell腳本
  • shell腳本執行方式

    • sh 腳本名 如:sh 1.sh 或者 /bin/bash 1.sh
    • 絕對路徑,如: /root/shell/1.sh ,注:需要給1.sh文件添加執行權限
    • 如果是單前文件夾下可以使用相對路徑,如 ./1.sh ,注:需要給1.sh文件添加執行權限
  • sh的參數

  • sh -x 1.sh 可以查看腳本執行過程

  • sh -n 1.sh 可以查看腳本中的語法錯誤,命令是否錯誤無法檢查

3. date命令用法

命令格式 含義
date 日期格式:2019年 06月 14日 星期五 21:04:56 CST
date +%Y
date +%m
date +%d
date +%H 小時
date +%M 分鐘
date +%S
date +%w 星期幾
date +%F 日期格式:2019-06-14
date +%s 時間戳
date +%T 時間:21:05:52
date “+%Y-%m-%d %H:%M:%S %w” 2019-06-14 21:07:22 5
date +%Y%m%d -d ‘-1 day’ 前一天的時間
date +%H:%M:%S -d ‘-1 hour’ 前一分鐘
[root@linux-01 ~]# date
2019年 06月 15日 星期六 10:56:07 CST
[root@linux-01 ~]# date +%Y
2019
[root@linux-01 ~]# date +%m
06
[root@linux-01 ~]# date +%d
15
[root@linux-01 ~]# date +%F
2019-06-15
[root@linux-01 ~]# date +%H
11
[root@linux-01 ~]# date +%M
02
[root@linux-01 ~]# date +%S
03
[root@linux-01 ~]# date +%T
11:03:11
[root@linux-01 ~]# date +"%F %T"
2019-06-15 11:03:48

## -d 選項用法 ## 
[root@linux-01 ~]# date -d "-1 day" +%F
2019-06-14
[root@linux-01 ~]# date -d "-1 day" +"%F %T"
2019-06-14 11:05:31
[root@linux-01 shell]# date -d  "-1 year"  +%F
2018-06-15
[root@linux-01 shell]# date -d  "-1 hour"  +%T
20:36:43


4. shell腳本中的變量

  • 當腳本中使用某個字符串較頻繁並且字符串長度很長時就應該使用變量代替(比如a=jdjjdjdddx)

  • 使用條件語句時,常使用變量 if [ $a -gt 1 ]; then … ; fi

  • 引用某個命令的結果時,用變量替代 n=wc -l 1.txt

  • 寫和用戶交互的腳本時,變量也是必不可少的 read -p "Input a number: " n; echo $n 如果沒寫這個n,可以直接使用$REPLY

  • 內置變量 $0, $1, $2… $0表示腳本本身,$1 第一個參數,$2 第二個 … $#表示參數個數

  • 數學運算a=1;b=2; c=$(($a+$b))或者$[$a+$b]

[root@linux-01 shell]# vim 1.sh

#!/bin/bash
a=6
if [ $a -gt 5 ] ;
then
    echo "變量a>5"

fi

[root@linux-01 shell]# sh 1.sh 
變量a>5

[root@linux-01 shell]# sh -x 1.sh
+ a=6
+ '[' 6 -gt 5 ']'
+ echo '變量a>5'
變量a>5


[root@linux-01 shell]# vim 2.sh
#!/bin/bash
read -p "Input a number: "  a
if [ $a -gt 5 ] ;
then
    echo "變量a>5"

fi

[root@linux-01 shell]# sh 2.sh 
Input a number: 12
變量a>5

5. shell腳本中的邏輯判斷

if命令的格式:

  • 格式1:if 條件 ; then 語句; fi

  • 格式2:if 條件; then 語句; else 語句; fi

  • 格式3:if …; then … ;elif …; then …; else …; fi

  • 邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意表示是中左右都是空格

  • 邏輯判斷可以使用 && || 結合多個條件:if [ $a -gt 5 ] && [ $a -lt 10 ]; then或者if [ $b -gt 5 ] || [ $b -lt 3 ]; then

6. 文件目錄屬性判斷

  • [ -f file ]判斷是否是普通文件,且存在

  • [ -d file ] 判斷是否是目錄,且存在

  • [ -e file ] 判斷文件或目錄是否存在

  • [ -r file ] 判斷文件是否可讀

  • [ -w file ] 判斷文件是否可寫

  • [ -x file ] 判斷文件是否可執行

## 判斷文件是否存在## 
[root@linux-01 shell]# ls
1.sh  2.sh
[root@linux-01 shell]# vim 3.sh

#!/bin/bash

a='/root/shell/look.txt'

if [ -f $a ];
then
    echo "look.txt 存在。"
else
    touch $a
    echo "look.txt 已經創建。"
fi 

[root@linux-01 shell]# sh 3.sh 
look.txt 已經創建。
[root@linux-01 shell]# sh -x 3.sh 
+ a=/root/shell/look.txt
+ '[' -f /root/shell/look.txt ']'
+ echo 'look.txt 存在。'
look.txt 存在。
[root@linux-01 shell]# 




## 判斷一個文件夾是否存在 ## 
[root@linux-01 shell]# vim 4.sh

#!/bin/bash

a='/root/shell/xihaji'

if [ -d $a ];
then
    echo "xihaji文件夾存在。"
else
    mkdir $a
    echo "xihaji文件夾已經創建。"
fi 
[root@linux-01 shell]# sh -x 4.sh 
+ a=/root/shell/xihaji
+ '[' -d /root/shell/xihaji ']'
+ mkdir /root/shell/xihaji
+ echo xihaji文件夾已經創建。
xihaji文件夾已經創建。
[root@linux-01 shell]# ll
總用量 16
-rw-r--r--. 1 root root  64 6月  15 11:10 1.sh
-rw-r--r--. 1 root root  89 6月  15 11:16 2.sh
-rw-r--r--. 1 root root 146 6月  15 21:40 3.sh
-rw-r--r--. 1 root root 156 6月  15 21:52 4.sh
-rw-r--r--. 1 root root   0 6月  15 21:40 look.txt
drwxr-xr-x. 2 root root   6 6月  15 21:52 xihaji
[root@linux-01 shell]# 

7. if特殊用法

  • if特殊用法

    • if [ -z “$a” ] 邏輯條件是:變量a的值爲空

    • if [ -n “$a” ] 邏輯條件是:變量a的值不爲空

    • if grep -q ‘123’ 1.txt; then 邏輯條件是:1.txt中含有’123’的行

    • if [ ! -e file ]; then 邏輯條件是:文件不存在

  • 圓括號與方括號的區別:

    • if (($a<1)); then … 等同於 if [ $a -lt 1 ]; then…

    • [ ] 中不能使用<,>,==,!=,>=,<=這樣的符號

  • 常見的一些用法注意:

    • if -z或者if -n 都不能作用在文件上,只能作用在變量上。

    • if [ -z “$a” ] 這個表示當變量a的值爲空時會怎麼樣

    • ! -z=-n

    • ! -n=-z

8. case 判斷

case 格式
case 變量名 in
value1)
command
;;
value2)
command
;;
value3 | value4) //在case程序中,可以在條件中使用 |,表示或的意思,
command
;;
*)
commond
;;
esac

[root@linux-01 shell]# vim case.sh 
#!/bin/bash
read -p "Please input a number: " n 
if [ -z "$n" ] 
then
echo "Please input a number."
exit 1
fi

n1=`echo $n|sed 's/[0-9]//g'` 
if [ -n "$n1" ]
then
echo "Please just input a number, without any other words."
exit 1
fi

if [ $n -lt 60 ] && [ $n -ge 0 ] 
then
tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0 
fi

case $tag in  
1)
echo "you didn't pass the exam!"
;;
2)
echo "good!"
;;
3)
echo "very good!"
;;
4)
echo "perfect!!!"
;;
*)
echo "Pls input a number range 0-100."
;;
esac




[root@linux-01 shell]# sh -x case.sh 
+ read -p 'Please input a number: ' n
Please input a number: 78
+ '[' -z 78 ']'
++ echo 78
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 78 -lt 60 ']'
+ '[' 78 -ge 60 ']'
+ '[' 78 -lt 80 ']'
+ tag=2
+ case $tag in
+ echo 'good!'
good!

9. for循環

9.1 累加求和

[root@linux-01 shell]# !vim
vim for1.sh 

#!/bin/bash

sum=0

for i in  `seq 1 20`;
do
    echo $sum + $i
    sum=$[$sum+$i]
    echo $sum
done
    echo $sum


[root@linux-01 shell]# sh -x for1.sh 
+ sum=0
++ seq 1 20
+ for i in '`seq 1 20`'
+ echo 0 + 1
0 + 1
+ sum=1
+ echo 1
1
+ for i in '`seq 1 20`'
+ echo 1 + 2
1 + 2
+ sum=3
+ echo 3
3
+ for i in '`seq 1 20`'
+ echo 3 + 3
3 + 3
+ sum=6
+ echo 6
6
+ for i in '`seq 1 20`'
+ echo 6 + 4
6 + 4
+ sum=10
+ echo 10
10
+ for i in '`seq 1 20`'
+ echo 10 + 5
10 + 5
+ sum=15
+ echo 15
15
+ for i in '`seq 1 20`'
+ echo 15 + 6
15 + 6
+ sum=21
+ echo 21
21
+ for i in '`seq 1 20`'
+ echo 21 + 7
21 + 7
+ sum=28
+ echo 28
28
+ for i in '`seq 1 20`'
+ echo 28 + 8
28 + 8
+ sum=36
+ echo 36
36
+ for i in '`seq 1 20`'
+ echo 36 + 9
36 + 9
+ sum=45
+ echo 45
45
+ for i in '`seq 1 20`'
+ echo 45 + 10
45 + 10
+ sum=55
+ echo 55
55
+ for i in '`seq 1 20`'
+ echo 55 + 11
55 + 11
+ sum=66
+ echo 66
66
+ for i in '`seq 1 20`'
+ echo 66 + 12
66 + 12
+ sum=78
+ echo 78
78
+ for i in '`seq 1 20`'
+ echo 78 + 13
78 + 13
+ sum=91
+ echo 91
91
+ for i in '`seq 1 20`'
+ echo 91 + 14
91 + 14
+ sum=105
+ echo 105
105
+ for i in '`seq 1 20`'
+ echo 105 + 15
105 + 15
+ sum=120
+ echo 120
120
+ for i in '`seq 1 20`'
+ echo 120 + 16
120 + 16
+ sum=136
+ echo 136
136
+ for i in '`seq 1 20`'
+ echo 136 + 17
136 + 17
+ sum=153
+ echo 153
153
+ for i in '`seq 1 20`'
+ echo 153 + 18
153 + 18
+ sum=171
+ echo 171
171
+ for i in '`seq 1 20`'
+ echo 171 + 19
171 + 19
+ sum=190
+ echo 190
190
+ for i in '`seq 1 20`'
+ echo 190 + 20
190 + 20
+ sum=210
+ echo 210
210
+ echo 210
210


9.2 遍歷一個目錄

[root@linux-01 shell]# vim for2.sh 

#!/bin/bash

cd /etc/
for a in `ls /etc/` ;
do
    if [ -d $a ] ;
    then
         echo   $a 
         ls $a
    fi
done

10. while循環

  • 語法 while 條件; do … ; done

10.1 案例1:每隔1分鐘檢查一下系統負載

每隔1分鐘檢查一下系統負載,當系統的負載大於10的時候,發一封郵件(監控腳本) 最小單元是任務計劃 cron

[root@linux-01 shell]# vim while.sh 
#!/bin/bash
while true  //true 1  : 都代表真
do
    load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
    if [ $load -gt 10 ]
    then
        /usr/local/sbin/mail.py  [email protected] 1oad  "high"  "$load"
    fi
    sleep 30 
done

[root@linux-01 shell]# sh -x while.sh 
+ true
++ head -1
++ cut -d. -f1
++ awk -F 'load average: ' '{print $2}'
++ w
+ load=0
+ '[' 0 -gt 10 ']'
+ sleep 30

10.2 案例2:

在循環過程過,需要用戶輸入一個數字;輸入的不是數字,是數字,輸入爲空;迴應相應的結果

[root@linux-01 shell]# vim while02.sh 

#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
        echo "you need input sth."
        continue
    fi
        n1=`echo $n|sed 's/[0-9]//g'`
    if [ -n "$n1" ]
    then
        echo "you just only input numbers."
        continue
    fi
    break 
done
echo $n



[root@linux-01 shell]# sh -x while02.sh 
+ :
+ read -p 'Please input a number: ' n
Please input a number: 123
+ '[' -z 123 ']'
++ echo 123
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ break
+ echo 123
123

11. break 跳出循環

break 常用於循環語句中,跳出整個循環語句,直接結束所有循環。

[root@linux-01 shell]# cat break.sh 

#!/bin/bash
for i in `seq 1 5`
do
    echo A=$i
    if [ $i -eq 3 ]
    #比較數字,用-eq ;若是比較的是字符串,那需要用 ==
    then
	break
    fi
    echo B=$i
done
echo C=$i


[root@linux-01 shell]# sh break.sh 
A=1
B=1
A=2
B=2
A=3
C=3

[root@linux-01 shell]# sh -x break.sh 
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo A=1
A=1
+ '[' 1 -eq 3 ']'
+ echo B=1
B=1
+ for i in '`seq 1 5`'
+ echo A=2
A=2
+ '[' 2 -eq 3 ']'
+ echo B=2
B=2
+ for i in '`seq 1 5`'
+ echo A=3
A=3
+ '[' 3 -eq 3 ']'
+ break
+ echo C=3
C=3

12. continue結束本次循環

忽略continue之下循環的代碼,直接進行下一次循環

[root@linux-01 shell]# vim continue.sh 
#!/bin/bash
for i in `seq 1 5`
do
    echo A=$i
    if [ $i -eq 3 ]
    #比較數字,用-eq ;若是比較的是字符串,那需要用 ==
    then
        continue
    fi
    echo B=$i
done
echo C=$i

[root@linux-01 shell]# sh -x continue.sh 
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo A=1
A=1
+ '[' 1 -eq 3 ']'
+ echo B=1
B=1
+ for i in '`seq 1 5`'
+ echo A=2
A=2
+ '[' 2 -eq 3 ']'
+ echo B=2
B=2
+ for i in '`seq 1 5`'
+ echo A=3
A=3
+ '[' 3 -eq 3 ']'
+ continue
+ for i in '`seq 1 5`'
+ echo A=4
A=4
+ '[' 4 -eq 3 ']'
+ echo B=4
B=4
+ for i in '`seq 1 5`'
+ echo A=5
A=5
+ '[' 5 -eq 3 ']'
+ echo B=5
B=5
+ echo C=5
C=5
[root@linux-01 shell]# sh  continue.sh 
A=1
B=1
A=2
B=2
A=3
A=4
B=4
A=5
B=5
C=5
[root@linux-01 shell]# sh break.sh 
A=1
B=1
A=2
B=2
A=3
C=3
[root@linux-01 shell]# 

13. exit退出整個腳本

exit可以定義退出的數值,可以用於確定腳本運行到什麼地方的時候,結束

[root@linux-01 shell]# vim exit.sh 

#!/bin/bash
for i in `seq 1 5`
do
    echo A=$i
    if [ $i -eq 3 ]
    #比較數字,用-eq ;若是比較的是字符串,那需要用 ==
    then
        exit
    fi
    echo B=$i
done
echo C=$i



[root@linux-01 shell]# sh exit.sh 
A=1
B=1
A=2
B=2
A=3
[root@linux-01 shell]# sh break.sh 
A=1
B=1
A=2
B=2
A=3
C=3
[root@linux-01 shell]# sh continue.sh 
A=1
B=1
A=2
B=2
A=3
A=4
B=4
A=5
B=5
C=5

14. shell中的select用法

select也是循環的一種,它比較適合用在用戶選擇的情況下。
比如,我們有一個這樣的需求,運行腳本後,讓用戶去選擇數字,選擇1,會運行w命令,選擇2運行top命令,選擇3運行free命令,選擇4退出。腳本這樣實現:

[root@linux-01 shell]# vim select.sh

#!/bin/bash
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
    case $command in
    w)
        w
        ;;
    top)
        top
        ;;
    free)
        free
        ;;
    quit)
        exit
        ;;
    *)
        echo "Please input a number:(1-4)."
        ;;
    esac
done
[root@linux-01 shell]# sh select.sh 
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit

1) w
2) top
3) free
4) quit
#? 

我們發現,select會默認把序號對應的命令列出來,每次輸入一個數字,則會執行相應的命令,命令執行完後並不會退出腳本。它還會繼續讓我們再次輸如序號。序號前面的提示符,我們也是可以修改的,利用變量PS3即可,再次修改腳本如下:

[root@linux-01 shell]# vim select.sh

#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
    case $command in
    w)
        w
        ;;
    top)
        top
        ;;
    free)
        free
        ;;
    quit)
        exit
        ;;
    *)
        echo "Please input a number:(1-4)."
    esac
done

[root@linux-01 shell]# sh select.sh 
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit

1) w
2) top
3) free
4) quit
Please select a number: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章