1.11-shell編程基礎

1.11 linux

          shell編程基礎正則表達式

內容:shell

1. shell介紹編程

2. 案例:系統開機啓動優化vim

3. shell腳本書寫步驟bash

4. if判斷語句網絡

5. for循環語句less

前言:ssh

1. 如何學好shell編程:編輯器

核心   

   多練--多思考--再練--再思考,堅持  循環

大忌

   拿來主義(能夠模仿 ,但要嚼爛了再下嚥)

方法

   閱讀,模仿,思考    能夠參考cat /etc/init.d/functions , /etc/rc.sysinit  , etc/profile練習

 

第1章 基礎知識

1.1 什麼是shell

命令解釋器    cat/etc/shells

CentOS默認的shellbash

查看linuxshell

echo $SHELL

cat /etc/passwd

1.2 什麼是shell腳本

命令大禮包,一個程序文件,包含若干行linux命令語句

循環,條件語句

查看腳本文件類型

[root@m01 ~]# file /server/scripts/fenfa.sh

/server/scripts/fenfa.sh: Bourne-Again shell script text executable

第2章 爲何要學shell編程

linux系統批量管理

提高工做效率

減小重複工做

第3章 學好shell編程所需的基礎知識

熟練使用vim編輯器

熟悉ssh終端

熟悉掌握linux經常使用命令

熟練掌握linux正則表達式及三劍客命令

 

第4章 企業案例:系統開機啓動項優化

除了下面5個服務之外都關閉

crond    sshd      network rsyslog  sysstat

定時任務 遠程鏈接  網絡    系統日誌 系統工具 

方法一:

第一個里程碑-分析想要的結果

chkconfig 服務名字  off

這種形式

chkconfig abrt-ccpp       off

chkconfig abrtd           off

chkconfig acpid           off

 

第二個里程碑-先排除crond rsyslog network sshd sysstat

[root@oldboyedu-39-nb ~]# chkconfig |egrep "sshd|crond|rsyslog|network|sysstat"

crond           0:off 1:off 2:on 3:on 4:on 5:on 6:off

network         0:off 1:off 2:on 3:on 4:on 5:on 6:off

.....

 

第三個里程碑-取出服務名字

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#\1#g'

abrt-ccpp      

abrtd          

....

 

第四個里程碑-拼接出 chkconfig 服務名字 off 樣子

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'

chkconfig abrt-ccpp        off

chkconfig abrtd            off

...

 

第五個里程碑-有了命令的形式樣子,有人來運行 執行

[root@oldboyedu-39-nb ~]# echo pwd|bash

/root

 

最終命令

[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'|bash

[root@oldboyedu-39-nb ~]# chkconfig |grep 3:on

crond           0:off 1:off 2:on 3:on 4:on 5:on 6:off

network         0:off 1:off 2:on 3:on 4:on 5:on 6:off

rsyslog         0:off 1:off 2:on 3:on 4:on 5:on 6:off

sshd            0:off 1:off 2:on 3:on 4:on 5:on 6:off

sysstat         0:off 1:on 2:on 3:on 4:on 5:on 6:off

 

排除的方法

chkconfig |sed -r '/sshd|rsyslog|crond|network|sysstat/d'

chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'

 

拼接 

chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'|sed -r 's#(.*)0.*#\1#gp'

chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'

對於包含sshdrsyslogcrondnetworksysstat的行 不處理 不進行替換 sg

//!      s###g

 

 

方法2     :

[root@oldboyedu-39-nb ~]# chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!s#(.*)0.*#\1#gp'

abrt-ccpp      

abrtd          

acpid          

atd            

auditd         

省略

saslauthd      

smartd         

svnserve       

udev-post      

chkconfig|sed -r '/sshd|rsyslog|crond|network|sysstab/d;s#(.*)0.*#chkconfig \1 off#g'

 

第5章 書寫一個腳本步驟

統一腳本存放目錄(自定義)     /server/scripts

推薦使用vim編輯器編輯腳本(方便拍錯)

第一行支出由哪一個命令解釋器來執行腳本中的內容

#!/bin/bash           命令解釋器

#author : 做者

#date :   時間

#ver : 版本

#desc :  描述

:編寫一個腳本---顯示日期和ip

[root@oldboy-gao ~]# vim /server/scripts/ip.sh

#!/bin/bash                                           指定命令解釋器執行腳本

# author: gao

# date: 180114

# ver: 版本

# desc:描述

 

date +%F

/sbin/ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

 

[root@oldboy-gao scripts]# file backup.sh             若是不知道 --文本文件

backup.sh: ASCII text

 

運行腳本

1)/bin/bash

[root@oldboy-gao ~]# /bin/sh /server/scripts/ip.sh

2018-01-13

10.0.0.201

 

2) 腳本的絕對路徑--須要x權限

[root@oldboy-gao ~]# /server/scripts/ip.sh

-bash: /server/scripts/ip.sh: Permission denied

 

加上x權限

[root@oldboy-gao ~]# chmod +x /server/scripts/ip.sh

[root@oldboy-gao ~]# /server/scripts/ip.sh

2018-01-13

10.0.0.201

 

第2章 if判斷

若是你是男生  && 你喜歡女生  

若是 [ 你是男生 ];那麼

    你喜歡女生 

果如

 

if [ 你是男生 ];then

    你喜歡女生 

fi

 

:若是a等於10則顯示恭喜你猜對了。

 

a=1               

if [ $a == 10 ];then                              兩個等號 中括號裏面兩邊空格

   echo "gongxi "

fi

[root@oldboyedu-39-nb scripts]# cat pan.sh          把判斷語句寫進腳本            

#!/bin/bash

a=$1

if [ $a == 10 ];then                              shell  遇到中括號,先敲倆空格

   echo "gongxi "

fi

[root@oldboyedu-39-nb scripts]# sh pan.sh 30         效果

[root@oldboyedu-39-nb scripts]# sh pan.sh 10

gongxi

 

中括號裏的東西都在哪裏放着呢

test  測試

1.1 比大小 

equal     等於             ==  -eq (test )  

[root@oldboyedu-39-nb scripts]#  [ 2 -eq  2 ]

[root@oldboyedu-39-nb scripts]# echo $?

0

 

greater than       大於        >   -gt          [ 2 -gt 1 ]

less   than        小於        <   -lt

greater than 而且 equal 大於等於       >=  -ge            [ 3 -ge 2 ]

[root@oldboyedu-39-nb scripts]# [ 2 -ge 2 ]

[root@oldboyedu-39-nb scripts]# echo $?

0

 

:若是條件符合(成功)顯示hahah

[root@oldboy-gao ~]# [ 0 -eq 0 ]&&echo hahah   [  ] 自己具備判斷的功能

hahah                                          &&命令執行成功,而且符合[  ]內的條件,執行後面命令

[root@oldboy-gao ~]# [ 1 -eq 0 ]&&echo hahah

 

:書寫一個腳本:輸入兩個參數 若是第一個參數大於第二個參數則 顯示 $1>$2

[root@oldboyedu-39-nb scripts]# cat pan.sh

#!/bin/bash

a=$1

b=$2

if [ $a -gt $b ];then

   echo "$a > $b "

fi

 

[root@oldboyedu-39-nb scripts]# sh  pan.sh 1 2

[root@oldboyedu-39-nb scripts]# sh  pan.sh 10 2

10 > 2

 

1.2 判斷是否存在

1. 判斷文件是否存在

2. 判斷目錄是否存在

1.2.1 判斷 /data/oldboy.txt 這個文件是否存在

[root@oldboyedu-39-nb scripts]# [ -f  /data/oldboy.txt ]

[root@oldboyedu-39-nb scripts]# echo $?

0                                                0表示存在

[root@oldboyedu-39-nb scripts]# [ -f /data/oldboy.tx ]

[root@oldboyedu-39-nb scripts]# echo $?

1                                                0則不存在

 

 

1.2.2 判斷 /data/           這個目錄是否存在

[root@oldboyedu-39-nb scripts]# [ -d /data/ ]

[root@oldboyedu-39-nb scripts]# echo $?

0

[root@oldboyedu-39-nb scripts]# [ -d /dataa/ ]

[root@oldboyedu-39-nb scripts]# echo $?

1

 

vim有個模板,好比,只要你建立.sh文件,就會顯示格式(文件名,姓名之類),vimrc,不建議使用

elif 另外一個條件

:判斷你輸入的目錄是否存在,若是不存在就建立他。

[root@oldboyedu-39-nb scripts]# cat dir.sh

#!/bin/bash

#filename:dir.sh

dir=$1

if [ ! -d $dir ];then                !不   若是目錄不存在  那麼

   mkdir -p $dir                           建立這個目錄

   echo  $dir create                     顯示已經建立好了 目錄 dir

fi

[root@oldboyedu-39-nb scripts]# sh dir.sh /oldboy

[root@oldboyedu-39-nb scripts]# sh dir.sh /oldbaby

/oldbaby create

 

 

小結:

1.判斷 if

if [ $a -eq $b ];then

   echo  

fi

2.if中可使用的內容  -eq  -ge*** -gt    -f***   -d***

 

瞭解:if的第三種用法   若是成功了--顯示什麼        若是不成功--顯示什麼

if [ $a -gt $b ];then

   echo  "$a > $b"

else

   echo  "$a no > $b"

fi

 

 

瞭解:if的第四種表達   若是成功了--下一個條件(成功)--下一個條件

          不斷地判斷

第3章 循環 

for循環語句

 語法: for 變量名 in 變量取值列表   

do.

  指令..

done..

 

:顯示1 2 3 4 5 .... 10

for  num  in 1 2 3 4 5 6 7 8 9 10           for循環執行過程

do                                     第一次 num 1        第二次 num 2

     echo $num                         echo 1              echo  2

done

                                                  

 

for num in {1..10}           

do

     echo $num

done

 

 

實例:優化linux開機啓動項目

第一個里程碑:明確目標-關閉沒必要要的 除了network crond sshd rsyslog sysstat

chkconfig 服務名字 off    

 

第二個里程碑:使用循環以後 咱們要的樣子

for fu in 列表    ##列表是咱們想要關閉的服務的名字  

do

     chkconfig $fu off

done

 

第三個里程碑:取出服務的名字

[root@oldboyedu-39-nb scripts]# chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'

abrt-ccpp

abrtd

acpid

atd

此處省略 好多字

    

第四個里程碑:獲得結果    

for fu in  $(chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}' )

do

#     chkconfig $fu off

      echo $fu

done

 

保險---確保萬無一失

排查腳本錯誤   調試腳本

vim /opt.sh

#!/bin/bash

for fu in $(chkconfig|egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{prind $1}')

do

#chkcon $fu off

 echo $fu                先顯示循環內容   檢查是否正確

done   

顯示腳本的執行過程

sh -x  opt.sh          顯示結果先執行的在下面

若是感受沒問題  把腳本里面內容一條一條,一個管道一個管道的排查

 

 

 

2.判斷   --if

大於              [ 3 -gt 2 ]

大於等於          [ 3 -ge 3 ]

等於              [ 3  == 3 ] 等於  [ 3 -eq 3 ]

 

判斷文件是否存在  [ -f /data/oldboy.txt ]

判斷目錄是否存在  [ -d /data ]

 

if [ 條件 ];then

    作什麼

fi

 

 

3.for循環

for 變量  in  列表

do

   命令

done

相關文章
相關標籤/搜索