2016/08/11:初涉shell腳本編程

感悟 : 

  經過對文本處理工具grep,sed等內容的,以及vim文本編輯器的學習,馬不停蹄的又進行了對shell腳本的學習。對shell腳本的認識是可以保存在本地,用的時候只要執行相關腳本,簡短的命令就可以完成操作,可以用來應對日常重復性工作,有效提高系統管理員的效率,避免在重復性工作上花費不必要的時間。


*************************************************************************************

shell腳本的用途有:
  自動化常用命令
  執行系統管理和故障排除
  創建簡單的應用程序

  處理文本或者文件


示例

    #!/bin/bash

    #author:LH

    #Version:1.0

    #Description:This script displays some imformation about your system.


腳本編輯完成后,需要進行幾個步驟,確??梢哉_執行

    1.chmod +x script或 bash script

    2.bash -n script 檢查腳本中語法錯誤

    3.bash -x 調試執行,按照腳本順序


變量 :實際就是命名的內存空間


編程語言分類

    強類型 :定義變量時要指定類型,java,python等

    弱類型 :無需提前指定類型,可直接調用

    

    變量命名規則:

        不能使用和保留字相同的名字

        只能使用數字字母下劃線,數字不可開頭

        見名知意

        駝峰命名法:大小駝峰


變量種類

        1.本地變量 作用范圍為當前shell進程,對其他進程,以及子shell無效

        2.環境變量 作用范圍是當前shell及其子進程

        3.局部變量 作用范圍為當前shell某段(一般是函數)

        4.位置變量 $1 $2 $3 …用于讓腳本在腳本代碼中調用傳入的參數

        5 特殊變量

                $? 上次命令執行狀態

                $0 在腳本內部引用腳本名稱本身

                $# 傳遞給當前腳本的參數的個數

                *************

                $* 和$@:表面的意思相同,都是表示傳遞給當前腳本的所有參數

                    區別:

                           $* 把所有參數看做一條字符串

                           $@ 所有參數讓當做單獨的字符串

    

引用方式

        變量引用 name="$USER",不可使用''

        命令引用 name=`CMD` =$(CMD)       

    

顯示所有變量 set

刪除變量 :unset name ,通常用于腳本末尾,釋放變量的命名空間,有利于內存合理使用


*********************************************

環境變量聲明、賦值

        ecport name=value

        declare -x name=VALUE

     引用方式和本地變量相同        

  

顯示所有環境變量:

    export    

    env

    printenv

刪除變量:unset name

bash 的內置環境變量

    PATH 環境變量   

    SHELL

    USER 當前用戶

    UID 當前用戶UID

    HISTSIZE 歷史命令保存數目

    HOME

    PWD 當前目錄

    OLDPWD 前一個目錄

    HISTFILE 歷史文件路徑

    PS1       

   PPID 父目錄


只讀變量:只能讀,但不能修改刪除

    

》》》》》》》》》》》》》》》》》》》》》》

算數運算

    ** 乘方

    實現

        1.、let var=2+8 –>echo $var

        2. echo '2+8'|bc  

        3. echo $[$RANDOM%50] 0-49間隨機數   

      

賦值

    let var++ 先賦值,再運算

    let ++var 先運算,再賦值

 

    +=自加,-=,*=,/= %=

 

邏輯運算:

    與:都為1時,才為1

    或:都為0時,才為0

    

   短路運算:

        與

            

        或

   異或 

    相同為假,相同為真

聚集命令,就是;連接,然后按照從左至右順序一個一個運行


條件性的執行操作符

    && – -AND THEN

    || – -OR ELSE

     $ grep -q no_such_user /etc/passwd \

        || echo 'No such user'  \為換行執行



*************************

數值測試

    -gt

    -ge

    -lt

    -le

    -ne 是否不等于

    -eq 是否等于


字符串測試

    > ASCLL 是否大于

    'string'=~ /pattern/ 左側字符串是否被右側PATTErn匹配到

    -z "string" 字符串是否為空,空為真,不空為假

    -n 與-z相反 


文件測試

    -e -a 文件存在為真,否為假

    -L 是否存在且為符號鏈接文件

    -p 管道文件

    -S 是否存在且為套接字文件

文件權限測試

    -r

    -w

    -x 是否存在且可執行


特殊權限測試

    -g sgid

    -u 是否存在且擁有suid

    -k 是否存在sticky權限


文件大小測試

    -s FILE:是否存在且非空


文件是否打開

    -t fd 表示文件描述符是否已經打開且與某終端相關

    -N FILE:文件自上次讀取之后是否被修改過

    -O FILE 當前用戶是否為文件屬主

    -G  是否為文件屬組


雙目測試:

    FILE1 -ef FILE2:1和2是否指向同一個設備上的相同inode

    

組合條件測試

    1.CMD1 && CMD 2 并且

        CMD1 || CMD 2 或者

    2.

    -a 并且

    -o 或者

    必須使用測試命令 ,test



*************************************

*************************************

**********************************8**    

練習

1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中

3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值

4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序

 netstat -nt |tr -s ' '|cut -d' ' -f5|tr -cs '0-9.' '\n'|egrep '([0-9]+.){3}[0-9]+'|uniq -c|sort -nr|tr -s ' ' '\t'

2 172.18.19.48

1 10.1.250.94

5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

echo `sed -n -e 10p -e 20p /etc/passwd|cut -d: -f3|tr '\n' +|sed -r 's@(.*)\+@\1@'`|bc

sed -n -e 10p -e 20p /etc/passwd 

6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和

6、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

7、寫一個腳本/root/bin/argsnum.sh,

接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,

并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

8、寫一個腳本/root/bin/hostping.sh,

接受一個主機的IPv4地址做為參數,測試是否可連通

。如果能ping通,則提示用戶“該IP地址可訪問”;

如果不可ping通,則提示用戶“該IP地址不可訪問”

9、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,

判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

10、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

[ -f /etc/nologin ] && echo "user disable login already" || (touch /etc/nologin; echo user disable login )

[ -f /etc/nologin ] && (rm -f /etc/nologin;echo user enable login) ||  echo user disable login already

11、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,

否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

12、計算1+2+3+…+100的值

13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之

    




    


                


原創文章,作者:000,如若轉載,請注明出處:http://www.www58058.com/34858

(0)
000000
上一篇 2016-08-16
下一篇 2016-08-16

相關推薦

  • 馬哥教育網絡班22期+第二周課程練習

    1、Linux文件管理類命令     cp:copy files and directories 復制文件和目錄         單源復制:cp [OPTION]… [-T] SOURCE DEST   &n…

    Linux干貨 2016-08-22
  • LVM相關使用

    前言: LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,它是Linux環境下對磁盤分區進行管理的一種機制,它由Heinz Mauelshagen在Linux 2.4內核上實現,Linux用戶安裝Linux操作系統時遇到的一個常見的難以決定的問題就是如何正確地評估各分區大小,以分配合適的硬盤空間。普通的磁盤分區管理方式在邏輯分區劃分…

    Linux干貨 2017-08-13
  • tcp socket文件句柄泄漏

    今天發現有臺redis機器上出現socket個數告警,這是很奇怪的現象。因為一臺redis服務器上就部署了幾個redis實例,打開的端口應該是有限。 1、netstat顯示的tcp連接數正常 netstat -n | awk '/^tcp/ {++state[$NF]} END …

    Linux干貨 2016-04-13
  • 博客作業-N22第二周

    1、linux上的文件管理類命令都有那些,其常用的使用方法及其相關示例演示。 答: cp 復制文件 [root@localhost network-scripts]# cp ifcfg-eno16777736 ifcfg-eno.bak [root@localhost network-scripts]# ls ifcfg-eno16777736  …

    Linux干貨 2016-08-22
  • 【超全整理】《Linux云計算從入門到精通》系列實戰筆記全放送

    ? ? ? 為了方便Linux云計算愛好者的學習查看,馬哥Linx云計算團隊特別整理了《Linux云計算從入門到精通》年度重磅大放送,囊括了整個學習過程的學習精華,內容全部由馬哥Linux云計算學員撰寫,歡迎大家支持!??! ? ? ? 詳情請看: ?一、Linux運維基礎實戰入門 從Linux0基礎入門開始,全面講解作為新手如何學習Linux,以及學習方法和…

    2017-09-14
  • 計算機淺談及Linux簡談

    一、計算機淺談: 電子計算機(英語:computer),亦稱電腦,是一種利用電子學原理,根據一系列指令對數據進行處理的工具。 在現代,機械計算機的應用已經完全被電子計算機所替換,其所相關的技術研究叫計算機科學,而“計算機技術”指的是將計算機科學的成果應用于工程實踐所派生的諸多技術性和經驗性成果的總合。“計算機技術”與“計算機科學”是兩個相關而又不同的概念,它…

    Linux干貨 2016-11-29
欧美性久久久久