linux學習筆記-09shell腳本

shell腳本

  • Shell腳本是將各種命令通過邏輯語句組合而成的程序

  • 腳本每行寫一條Linux命令。并且一個完整的Shell腳本則應該包括"腳本聲明"、"注釋信息"和"可執行語句"

    腳本聲明(#!):告知系統用何種shell來解釋。
    注釋信息(#):對可執行語句或程序功能做介紹,可以不寫。
    可執行語句:執行的具體命令。
    
  • 執行腳本有三種方法

    腳本文件路徑:./Example.sh
    sh腳本文件路徑:sh Example.sh
    source腳本文件路徑:source Example.sh
    
  • 采用直接執行的方式有時可能權限不夠,需要給腳本可執行權限,或者用sh,source執行腳本

    ./Example.sh
    發現權現不夠
    chmod u+x Example.sh
    ./Example.sh
    
  • shell可以接受用戶輸入

    ./Example.sh one two three four five six
    $0    當前執行Shell腳本的程序名。
    $1-9,${10},${11}……    參數的位置變量。
    $#    一共有多少個參數。
    $*    所有位置變量的值。
    $?    判斷上一條命令是否執行成功,0為成功,非0為失敗。
    

測試語句

  • 測試語句能夠測試特定的表達式是否成立,當條件成立時返回值為0,否則返回其他數值

  • 測試語句格式:[ 測試語句 ],其中 中括號兩邊均有一個空格

  • 測試語句可以分為:文件測試,邏輯測試,整數值比較,字符串比較

文件測試

  • 操作符

    -d    測試是否為目錄。
    -f    判斷是否為文件。
    -e    測試文件或目錄是否存在。
    -r    測試當前用戶是否有權限讀取。
    -w    測試當前用戶是否有權限寫入。
    -x    測試當前用戶是否有權限執行。
    
  • 示例

    [ -d /etc ]
    $?
    

邏輯測試

  • [ 表達式1 ] 操作符 [ 表達式2 ]

  • 操作符

    &&    邏輯的與,"而且"的意思。
    ||    邏輯的或,"或者"的意思。
    !    邏輯的否。
    
  • 示例

      [ $USER != root ] && echo "user" || echo "root"
    

整數比較

  • 整數值比較:[ 整數1 操作符 整數2 ]

  • 運算符

    -eq    判斷是否等于
    -ne    判斷是否不等于
    -gt    判斷是否大于
    -lt    判斷是否小于
    -le    判斷是否等于或小于
    -ge    判斷是否大于或等于
    
  • 示例

    [ 10 -gt 10 ]
    
    獲取當前可用的內存量,并將此值賦值給變量FreeMem:
    FreeMem=`free -m | grep cache: | awk '{print $3}'`
    判斷此值是否小與1024(單位是M),若小于則提示內存不足:
    [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
    

字符串比較

  • [字符串1 操作符 字符串2]

  • 運算符

    =    比較字符串內容是否相同。
    !=    比較字符串內容是否不同。
    -z    判斷字符串內容是否為空。
    
  • 示例

    [ $LANG != "en.US" ] && echo "Not en.US"
    

條件測試語句

if語句

  • if條件語句

    if 條件測試語句
    then 命令
    fi
    
  • 雙分支結構

    if 條件測試語句
    then 命令
    else
    命令
    fi
    
  • 多分支結構

    if 條件測試語句
    then 命令
    elif 條件測試語句
    then 命令
    else
    命令
    fi
    
  • 示例1

    #!/bin/bash
    DIR="/media/cdrom"
    if [ !-e $DIR ]; then
      mkdir -p $DIR
    fi
    
  • 示例2 為了減少用戶的等待時間,需要為ping命令追加-c參數代表發送數據包的個數,-i代表每0.2秒發一個數據包,-W則為3秒即超時。而$1為用戶輸入的第一個參數(IP地址),$?為上一條命令的執行結果,判斷是否等于0(即成功)

    ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
    if[ $? -eq 0 ]; then
      ehco "Host $1 is up"
    else
      echo "Host $1 is down"
    fi
    
  • 示例3 根據分數評等級

    #!/bin/bash
    read -p "Enter your socre(0~100)":GRADE
    if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
      echo "$GRADE is Excellent"
    elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
      echo "$GRADE is Pass"
    else
      echo "$GRADE is Fail"
    fi
    

for語句

  • 基本命令

    for 變量名 in 取值列表
    do
      命令
    done
    
  • 示例:Shell腳本提示用戶輸入要設置的密碼并賦值給PASSWD變量,從users.txt文件中讀入用戶名并賦值給UNAME變量, 而查看用戶的信息都重定向到/dev/null文件,不顯示到屏幕

    #!/bin/bash
    read -p "Enter the user password:" PASSWD
    for UNAME in `cat users.txt`; do
      id $UNAME &> /dev/null
      if [ $? -eq 0 ]; then
        echo "Already exists"
      else
        useradd $UNAME &> /dev/null
        echo $PASSWD | passwd --stdin $UNAME &> /dev/null
        if [ $? -eq 0 ]; then
          echo "Create success"
        else
          echo "Create failture"
        fi
      fi
    done
    
  • 示例:從列表文件中讀取主機地址,逐個測試是否在線

    HLIST = $(cat ~/ipadds.txt)
    for IP in HLIST; do
      ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
      if [ $? -eq 0 ]; then
        echo "Host $IP is up"
      else
        echo "Host $IP is down"
      fi
    done
    

while語句

  • 基本語法

    while 條件測試語句
    do
      命令
    done
    
  • 示例:隨機生成一個0-999的整數,判斷并提示用戶輸入的值過高或過低

    #!/bin/bash
    
    PRICE = $(expr $RANDOM % 1000)
    TIMES = 0
    echo "商品實際價格為0-999之間,猜猜看是多少?"
    while true; do
      read -p "請輸入你猜測的價格數目:" INT
      let TIMES++
      if [ $INT -eq $PRICE ]; then
        echo "恭喜你答對了,實際價格是 $PRICE"
        echo "你總共猜測了 $TIMES 次"
        exit 0
      elif [ $INT -gt $PRICE ]; then
        echo "太高了!"
      else
        echo "太低了!"
      fi
    done
    

case語句

  • 基本語法

    case 變量值 in
      模式1 )
        命令
        ;;
      模式2)
        命令
        ;;
    esac
    
  • 示例

    #!/bin/bash
    read -p "請輸入一個字符,并按Enter鍵確認:" KEY
    case $KEY in
      [a-z]|[A-Z] )
        echo "您輸入的是 字母。"
        ;;
      [0-9]) )
        echo "您輸入的是 字母。"
        ;;
    esac
    

計劃任務服務

一次性任務

  • 一次性任務吧,它是由atd服務/進程來實現的,計劃的管理操作是"at"命令

    at <時間>    安排一次性任務
    atq或at -l    查看任務列表
    at -c 序號    預覽任務與設置環境
    atrm 序號    刪除任務
    
  • 示例

    交互式:
    at 23:30
    at > systemctl start httpd
    at > job 3 at Mon Apr 27 23:30:00 2015
    
    非交互式:
    echo "systemctl start httpd" | at 23:30
    
    查看任務:
    atq
    

長期任務

  • 基本命令

    創建、編輯計劃任務:crontab -e [-u 用戶名]
    查看計劃任務:crontab -l [-u 用戶名]
    刪除計劃任務:crontab -r [-u 用戶名]
    
  • 創建參數
    crontab參數
    crontab參數
  • 示例,每周1、3、5的凌晨3點25分將/home/wwwroot目錄打包備份為backup.tar.gz"

    crontab -e
    25 3 * * 1,3,5 /usr/bin/tar -czvf backukp.tar.gz /home/wwwroot
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容

  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,751評論 0 11
  • 基礎命令 主要的命令和快捷鍵 Linux系統命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,114評論 0 0
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,192評論 2 33
  • 本文全面系統地介紹了shell腳本調試技術,包括使用echo, tee, trap等命令輸出關鍵信息,跟蹤變量的值...
    liuzg0734閱讀 908評論 0 14