Shell腳本編程(上)

    Shell腳本編程基礎

Shell 腳本基礎:包含一些命令或聲明并符合一定格式的文本文件
Shell 腳本用途:
        1. 自動化常用命令
        2. 執行系統管理和故障排除
        3. 創建簡單的應用程序
        4. 處理文本和文件

創建Shell腳本:
        首行的固定寫法:
            1. #!/bin/bash      
            2. #!/bin/sh
    注:此行是告訴系統執行的時候要調用什么解釋器。如果首行不寫,那么執行的時候需要使用命令bash。
腳本寫法:
      注釋寫法:
            #!/bin/bash
            #
            #Filename:XXXX.sh        腳本文件名稱
            #Description:xxxx        說明
            #Author:xxxx             作者
            #Email:xxxx@xx.xxx       聯系方式
            #Revision:1.0            版本
            #Date:xxxxx              腳本創建日期
            #Note:xxxx               注解
        Shell腳本編程(上)
    注:每一行之前最好有一個注釋;腳本名稱使用.sh結尾的盡量避免使用中文;#表示注釋,此行不執行。
腳本的執行:
        1. bash
        2. sh
        3. 加執行權限
                1) 相對路徑
                2) 絕對路徑
                3) 放到$PATH變量指定的目錄里面,直接執行(tab)
        腳本調試執行:
                bash -n 檢查語法錯誤,不檢查拼寫錯誤
                bash -x或sh -x 顯示腳本執行的時候每一個命令具體的執行結果

變量:暫時存放數據的地方,一個具有名稱的內存地址空間。
    數據存儲方式:1. 字符
                             2. 數值: 整形、浮點型
    作用:1. 數據存儲格式
              2. 參與的運算
              3.表示的數據范圍
    類型:
          強類型(如 JAVA C#):數值型和字符型不能直接計算,除非顯示把字符型轉換成數值型。

          弱類型(如 shell php):不會嚴格區分變量類型,定義變量的時候不用指定變量類型,默認字符型,如果想要計算的時候會自動幫你轉換成數值型。
變量的命名規則:
        1.不能使用if for bash cd ls date 關鍵字
        2.不能以數字開頭,不能使用特殊符號,只能使用數字、字母及下劃線
        3.見名知意:看見名字知道此文件的意義
        4.建議變量使用大寫
bash變量的種類:
        本地變量(全局變量)  僅僅對當前shell生效
        環境變量    對當前shell以及其他shell都生效 export
        局部變量(私有變量)  生效范圍位當前shell進程中某代碼片段,通常用在函數里面,使用local
本地變量:name=’value’
可以使用引用value:
        1.可以是直接字串:name=”root”
        2.變量引用:name=”$USER”
        3.命令引用:name=COMMAND  name=$(COMMAND)
變量引用:${name} $name
        ” ” :弱引用  會把雙引號里面的變量替換
        ‘ ‘  :強引用  不會把引號里面的變量進行替換
        “ : 把反引號里面的命令執行結果賦值給變量
顯示已定義的所有變量: set
刪除變量: unset name
    注:取消變量和變量置空是兩種不同概念 unset HZ  
                                                                  HZ=   

環境變量:
    變量聲明、賦值:
            export name=VALUE
            declare -x name=VALUE
    變量引用: $name, ${name}
    顯示所有環境變量:
            env, pringtenv, export, declare -x ,set
    刪除: unset name 
    bash有許多內建的環境變量: 
            $PATH 命令的搜尋路徑
            $OLDPWD 前一個工作目錄
            $LANG 目前的工作語系
            $BASH bash的完整路徑名
            $BASH_VERSION Bash的版本
            $HISTCONTROL 控制指令是否存入歷史文件中
            $OSTYPE 顯示系統類型
            $MAIL 存放郵件的文件
            $MAILCHECK 多久檢查一下郵件 
            $PWD 當前路徑
            $SSH_tty 當前登錄的tty
            $SHLVL 當前shell在幾層
            $RANDOM 隨機數
只讀變量:只能聲明,但不能修改和刪除
    聲明只讀變量:readonly name
                            declare -r name
    查看只讀變量: readonly -p
位置變量: 在腳本代碼中調用通過命令行傳遞給腳本的參數
        $1,$2,…: 對應第1、第2等參數,shift [n]換位置
        $0: 命令本身
        $*: 傳遞給腳本的所有參數,全部參數合為一個字符串
        $@: 傳遞給腳本的所有參數,每個參數為獨立字符串。如”$@”用「”」括起來的情況、以”$1″ “$2” … “$n” 的形式輸出所有參數。
        $#: 傳遞給腳本的參數的個數
        注:$@、$*只在被雙引號包起來的時候才會有差異
        set — 清空所有位置變量
算數運算

        1. let num=算數表達式 let r=9+9

Shell腳本編程(上)

        2. var=$[算數表達式] r=$[9+9]

Shell腳本編程(上)

        3. var=$((算數表達式)) r=$((9+9))

Shell腳本編程(上)

        4. expr 8 + 3 (注意要有空格?。。?

Shell腳本編程(上)

        5. declare -i   r=9+9

Shell腳本編程(上)

         6. bc   計算1-100的和:echo {1..100} | tr ” ” “+” | bc

Shell腳本編程(上)

        注: expr 8 * 8 乘號需要用\轉義,除號不用

    +=,  i+=3等于i=i+3 
    -=,  i-=3等于i=i-3
    =,  i=3等于i=i*3
    /=,  i/=3等于i=i/3
    %=,  i%=3等于i=i%3
   
    i++  先執行 執行完加1 (用的比較多)

    ++i  先加1,再執行

Shell腳本編程(上)

邏輯運算
        true 1   false 0

        1 與 1 = 1
        1 與 0 = 0
        0 與 1 = 0
        0 與 0 = 0

        1 或 1 = 1
        1 或 0 = 1 
        0 或 1 = 1
        0 或 0 = 0

        與的時候 只要有一個為假 那么整個結果就是假的。
        或的時候 只要有一個為真 那么整個結果就是真。

        !1 = 0
        !0 = 1

        && 與
        || 或

        1 && 1 = 1
        1 && 0 = 0
        1 || 1 = 1
        1 || 0 = 1

        命令執行成功 我們認為是真 
        命令執行失敗 我們認為是假

短路預算:

        命令1 && 命令2  

        命令1 成功執行 則執行命令2

        命令1 執行失敗 則不會執行命令2

        命令1 || 命令2  

        命令1成功執行,則命令2不執行

        命令1執行失敗,則命令2執行

        命令1 && 命令2 || 命令3
        如果命令1 成功執行 則執行命令2 且命令3不會執行
        如果命令1 執行失敗 那么命令2就不會執行,則命令3執行
 
        如果  命令1 成功
         則    命令2;
        否則  命令3;
退出狀態
       使用$?  0代表前面一個命令執行成功
                    非0 代表前面一個命令執行失敗
                    可以在腳本里面自定義退出狀態

        根據退出狀態來判斷一個命令的執行成功與否

    exit [n]:自定義退出狀態碼
        注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字
        注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼

測試條件
        test  測試條件
        [ 測試條件 ]
        [[ 測試條件 ]] 條件測試的前后要加上空格
                 生產環境建議使用兩個中括號

   
數值測試:
        -gt: 是否大于
        -ge: 是否大于等于
        -eq: 是否等于
        -ne: 是否不等于
        -lt: 是否小于
        -le: 是否小于等于

    [[ 6 > 2 ]] && echo “OK”

字符串測試
        == 是否等于
        >  是否大于
        <  是否小于
        != 是否不等于
        =~ 左邊的字符串是否包含右邊指定的字符串
        注:此表達式一般用于[[ ]]中;擴展的正則表達式
        -z 測試字符串是否為空,空為真,不空為假
        -n 測試字符串是否不為空,不空為真,空為假
        注:用于字符串比較時的用到的操作數都應該使用引號

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

(0)
木
上一篇 2017-04-16 21:56
下一篇 2017-04-16 22:19

相關推薦

  • 第六周

      第6周   1 復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; cp /etc/rc.d/rc.sysinit ; sed -i 's@^[[:space:]]\+@#@g&#03…

    Linux干貨 2017-02-13
  • LAMP及nfs、samba的綜合練習

    練習一: 配置第一臺主機:服務端共享目錄: [root@localhost /]# yum install nfs-utils [root@localhost /]# systemctl start rpcbind [root@localhost /]# sy…

    Linux干貨 2016-10-24
  • 實現CenOS7網卡名傳統方式

    網卡命令:理念 CentOS 6之前,網絡接口使用連續號碼命名:eth0、eth1等,當 增加或刪除網卡時,名稱可能會發生變化 CentOS 7使用基于硬件,設備拓撲和設置類型命名: (1) 網卡命名機制 systemd對網絡設備的命名方式 (a) 如果Firmware或BIOS為主板上集成的設備提供的索引信 息可用,且可預測則根據此索引進行命名, 例如en…

    Linux干貨 2017-12-19
  • 進程及任務管理

    進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 Process: 運行中的程序的一個副本,是被載入內存的一個指令集合     進程ID(Process ID,PID)號碼被用來標記各個進程     UID、GID、和SELi…

    Linux干貨 2016-09-09
  • DNS以及bind使用

    DNS以及域名分發布式數據庫相關知識      一、 DNS相關介紹           1. DNS(Domain Name Service):域名解析服務協議         &nbsp…

    2015-03-17
  • 文本處理工具命令使用以及文件權限管理

    一 sort uniq wc cut tr 等文本處理工具的基本用法 1. 通過who命令查看當前登錄了哪些用戶,并通過uniq或sort -u命令將重復的行只顯示一次 [root@Linuxprobe ~]# who | cut -d’ ‘ -f1 | sort -u 目前查看系統有兩個用戶登錄 harrycai root [root@Linuxprobe…

    Linux干貨 2017-08-13

評論列表(1條)

  • renjin
    renjin 2017-04-21 11:41

    主要介紹了shell腳本編程的基礎用法,內容總結的非常詳細,但是排版上還需要再注意一下!

欧美性久久久久