shell-1

chunyang315發表於2018-04-18

shell介紹

  • shell是工作中必備的技能,才能勝任運維的工作。它是一種指令碼語言。它較於python、程式語言C、PHP來說算是比較簡單的了。

  • shell其實是系統命令的集合,將一些命令寫入到檔案中,再去執行這個檔案。它也有自己的語法規則,比如使用邏輯判斷、迴圈等。

  • 可以關注公眾號aming_linux或者是blog。lishiming.net來練習

  • 在shell中也是可以自定義函式的,目的是為了減少重複出現的程式碼。

  • shell指令碼可以實現自動化運維,能大大增加我們的運維效率


Shell指令碼結構和執行

  • 編寫shell指令碼時,第一行必須寫成#!/bin/bash ,它的作用是後面語句是由/bin/bash 去解析的。因為有了它才能這樣去執行./123.sh或者/bin/bash 123.sh

  • 給檔案增加x許可權,就可以./123.sh這樣去執行,不然的話使用sh命令。例sh 123.sh

  • 指令碼中所有已#開頭的行為解釋說明。在系統中存在一個特殊的指令碼,/etc/init.d/network中有2行是比較特殊的

 chkconfig: 2345 10 90   /定義啟動指令碼的級別。第10個啟動,第90個關閉
 description: Activates/Deactivates all network interfaces configured to \             start at boot time.  //針對該指令碼的解釋說明

這2行是必須存在的,如果沒有這二行,那麼啟動指令碼就不能加入開戶啟動項中。

  • 所寫的指令碼最好是以.sh結尾,是為了以後方便查詢,也為了後面的其他人員接手工作能知道它是什麼。

  • 執行方式有2種
    (1)先增加x許可權,再./123.sh
    (2)bash 123.sh

  • 檢視指令碼執行過程可以使用-x選項

sh -x 123.sh
  • 檢視指令碼是否有語法錯誤
sh -n 123.sh

date命令用法

  • date命令單獨使用用來顯示系統的時間。在shell中它的作用很大,比如在指令碼中標記一個日誌,或者針對一個檔案進行更改,可以使用date給它進行裝飾。例如,每天備份mysql,生成一個.sql檔案,就可以針對這個sql檔案增加一個日期標記。這樣就能很清晰的知道備份的sql檔案是在哪一天生成的。還可以標記一個星期幾,下週就會覆蓋這一週的檔案,這樣就不用手動的去刪除這些檔案了

  • 標記年月日

date +%Y-%m-%d  //%Y表示4位數的年 比如2018
date +%y-%m-%d  //%y 表示2位數的年  比如18  

%m 表示月份 %M表示分鐘

[root@zcy-1 ~]# date +%Y
2018
[root@zcy-1 ~]# date +%y /年
18
[root@zcy-1 ~]# date +%m  /月份
04
[root@zcy-1 ~]# date +%M   /分鐘
09
[root@zcy-1 ~]# date +%d   /年
18
[root@zcy-1 ~]# date +%D
04/18/18

[root@zcy-1 ~]# date +%Y%m%d
20180418
[root@zcy-1 ~]# date +%F
2018-04-18
[root@zcy-1 ~]# date +%H  //小時
00
[root@zcy-1 ~]# date +%S  //秒數
38

時間標記

[root@zcy-1 ~]# date +%T  //0點16分12秒
00:16:12
[root@zcy-1 ~]# date +%H:%M:%S
00:18:26

週數或者星期幾

[root@zcy-1 ~]# date +%w  /周3 
3
[root@zcy-1 ~]# date +%W  / 今年的1616

cal用來顯示日曆

[root@zcy-1 ~]# cal
      四月 2018     
日 一 二 三 四 五 六
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

date表示之前的日期

[root@zcy-1 ~]# date 
20180418日 星期三 00:23:43 CST
[root@zcy-1 ~]# date -d "-1 day "
20180417日 星期二 00:23:46 CST
[root@zcy-1 ~]# date -d "-1 day " +%F
2018-04-17
[root@zcy-1 ~]# date -d "-1 month " +%F
2018-03-18
[root@zcy-1 ~]# date -d "-1 years " +%F
2017-04-18

標記時間戳

[root@zcy-1 ~]# date +%s -d  "2108-04-18 00:28:55"
4364123335
[root@zcy-1 ~]# date -d @4364123335
21080418日 星期三 00:28:55 CST

shell腳中的變數

  • 什麼時候使用變數呢
    當指令碼中使用某個字串較頻繁並且字串長度很長的時候就應該使用變數代替。它可以使指令碼比較小巧,對於一些修改或者是其他的操作,也能很好的去修改。

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

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

  • 寫和使用者互動的指令碼時,變數也是必不可少的read -p "lnput a number:"n; echo $n如果沒有寫這個n,可以直接使用$REPLY

    -在shell中是有內建變數的
    0

    0 表示指令碼本身
    1 表示第一個引數
    2
    2 表示第二個引數
    # 表示引數的個數

  • 數學運算 中使用變數

a=1;b=2;c=$(($a+$b)) 
a=1;b=2;c=$[$a+$b]

2種表示方法輸出的結果是一樣的

  • 變數簡單的講就是一個變化的引數、一個數值或者是一個字串,可以引用它,呼叫它。

Shell指令碼中的邏輯判斷

  • 在shell指令碼中很多地方都是邏輯判斷,比如判斷數值、判斷檔案,針對判斷的結果再去做一些操作。沒有判斷就不能去做一些操作,不然只能純粹的去敲命令了。

  • shell 中邏輯判斷的語法
    (1)格式1: if 條件 ; then 語句 ; fi這裡if 與fi是相對應的,表示滿足條件後又怎麼樣。

[root@zcy-2 ~]# a=5
[root@zcy-2 ~]# if [ $a -gt 4 ] ; then echo ok; fi 
ok
[root@zcy-2 ~]# if [ $a -gt 6 ] ; then echo ok; fi 
[root@zcy-2 ~]# 

``` 這裡-gt表示大於,當a大於4的時候就輸出ok ,超過a變數的值的 時候沒有任何輸出。 

編寫一個簡單的指令碼if1.sh,並執行它





<div class="se-preview-section-delimiter"></div>

[root@zcy-2 shell]# cat if1.sh

!/bin/bash

a=8
if [ $a -gt 3 ]
then
echo ok
fi
[root@zcy-2 shell]#
[root@zcy-2 shell]# sh if1.sh
ok
[root@zcy-2 shell]#


該種格式使用較頻繁  
(2)格式2 





<div class="se-preview-section-delimiter"></div>

if 條件; then 語句; else 語句; fi //表示滿足條件這怎麼樣,不滿足條件又怎麼樣






<div class="se-preview-section-delimiter"></div>

[root@zcy-2 shell]# cat if2.sh

!/bin/bash

a=2
if [ $a -gt 3 ]
then
echo ok
else
echo bad
fi
[root@zcy-2 shell]# sh -x if2.sh
+ a=2
+ ‘[’ 2 -gt 3 ‘]’
+ echo bad
bad
[root@zcy-2 shell]#
表示a的值大於3輸出OK ,不大於3的時候輸出bad

3)格式3





<div class="se-preview-section-delimiter"></div>

if 條件; then 語句 ; elif 條件 ; then 語句 ; else 語句 ; fi

舉個栗子





<div class="se-preview-section-delimiter"></div>

[root@zcy-2 shell]# !cat
cat if3.sh

!/bin/bash

a=4
if [ agt5]thenecho>1elif[

a -gt 5 ] then echo “>1” elif [
a -lt 6 ]
then
echo “ok”
else
echo bad
fi
[root@zcy-2 shell]# sh -x if3.sh
+ a=4
+ ‘[’ 4 -gt 5 ‘]’
+ ‘[’ 4 -lt 6 ‘]’
+ echo ok
ok
[root@zcy-2 shell]#
[root@zcy-2 shell]# cat if3.sh

!/bin/bash

a=4
if [ agt5]thenecho>1elif[

a -gt 5 ] then echo “>1” elif [
a -lt 3 ]
then
echo “ok”
else
echo bad
fi
[root@zcy-2 shell]# sh -x if3.sh
+ a=4
+ ‘[’ 4 -gt 5 ‘]’
+ ‘[’ 4 -lt 3 ‘]’
+ echo bad
bad
[root@zcy-2 shell]#

表示當滿足a大於5的時候輸出>1
      當滿足a小於6的時候輸出OK
      當2個條件都不滿足時輸出bad   

(43種格式中第3種的格式是很少用到的,第一種是常用的 

 - 邏輯判斷表示式 






<div class="se-preview-section-delimiter"></div>

if [ agt

a -gt
b ] /a大於b
if [ alt5]/a5if[
a -lt 5 ] /a 小與5 if [
b -eq 10 ] /b 等於10






<div class="se-preview-section-delimiter"></div>

-gt /表示> 大於
-lt /表示< 小於
-ge /表示>= 大於或等於
-le /表示<= 小與或等於
-eq /表示 == 等於
-ne /表示!= 不等於


 - 可以使用&& 和  | | 結合多個條件






<div class="se-preview-section-delimiter"></div>

if [ a -gt 5 ] && [

a -gt 5 ] && [
a -lt 10 ]; then //需要同時滿足這2個條件,並且的意思
if [ bgt5]||[
b -gt 5 ] || [
b -lt 4 ]; then //2個條件滿足其中一個都可以 或者的意思
“`