linux學(xué)習(xí)筆記-09shell腳本

shell腳本

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

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

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

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

    ./Example.sh
    發(fā)現(xiàn)權(quán)現(xiàn)不夠
    chmod u+x Example.sh
    ./Example.sh
    
  • shell可以接受用戶輸入

    ./Example.sh one two three four five six
    $0    當(dāng)前執(zhí)行Shell腳本的程序名酣溃。
    $1-9,${10},${11}……    參數(shù)的位置變量。
    $#    一共有多少個參數(shù)纪隙。
    $*    所有位置變量的值赊豌。
    $?    判斷上一條命令是否執(zhí)行成功,0為成功绵咱,非0為失敗碘饼。
    

測試語句

  • 測試語句能夠測試特定的表達式是否成立,當(dāng)條件成立時返回值為0悲伶,否則返回其他數(shù)值

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

  • 測試語句可以分為:文件測試,邏輯測試麸锉,整數(shù)值比較钠绍,字符串比較

文件測試

  • 操作符

    -d    測試是否為目錄。
    -f    判斷是否為文件花沉。
    -e    測試文件或目錄是否存在柳爽。
    -r    測試當(dāng)前用戶是否有權(quán)限讀取媳握。
    -w    測試當(dāng)前用戶是否有權(quán)限寫入。
    -x    測試當(dāng)前用戶是否有權(quán)限執(zhí)行磷脯。
    
  • 示例

    [ -d /etc ]
    $?
    

邏輯測試

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

  • 操作符

    &&    邏輯的與蛾找,"而且"的意思。
    ||    邏輯的或争拐,"或者"的意思腋粥。
    !    邏輯的否。
    
  • 示例

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

整數(shù)比較

  • 整數(shù)值比較:[ 整數(shù)1 操作符 整數(shù)2 ]

  • 運算符

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

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

字符串比較

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

  • 運算符

    =    比較字符串內(nèi)容是否相同。
    !=    比較字符串內(nèi)容是否不同绑雄。
    -z    判斷字符串內(nèi)容是否為空展辞。
    
  • 示例

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

條件測試語句

if語句

  • if條件語句

    if 條件測試語句
    then 命令
    fi
    
  • 雙分支結(jié)構(gòu)

    if 條件測試語句
    then 命令
    else
    命令
    fi
    
  • 多分支結(jié)構(gòu)

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

    #!/bin/bash
    DIR="/media/cdrom"
    if [ !-e $DIR ]; then
      mkdir -p $DIR
    fi
    
  • 示例2 為了減少用戶的等待時間,需要為ping命令追加-c參數(shù)代表發(fā)送數(shù)據(jù)包的個數(shù)万牺,-i代表每0.2秒發(fā)一個數(shù)據(jù)包罗珍,-W則為3秒即超時。而$1為用戶輸入的第一個參數(shù)(IP地址)脚粟,$?為上一條命令的執(zhí)行結(jié)果覆旱,判斷是否等于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 根據(jù)分數(shù)評等級

    #!/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腳本提示用戶輸入要設(shè)置的密碼并賦值給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的整數(shù)团南,判斷并提示用戶輸入的值過高或過低

    #!/bin/bash
    
    PRICE = $(expr $RANDOM % 1000)
    TIMES = 0
    echo "商品實際價格為0-999之間噪沙,猜猜看是多少?"
    while true; do
      read -p "請輸入你猜測的價格數(shù)目:" 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
    

計劃任務(wù)服務(wù)

一次性任務(wù)

  • 一次性任務(wù)吧冗疮,它是由atd服務(wù)/進程來實現(xiàn)的萄唇,計劃的管理操作是"at"命令

    at <時間>    安排一次性任務(wù)
    atq或at -l    查看任務(wù)列表
    at -c 序號    預(yù)覽任務(wù)與設(shè)置環(huán)境
    atrm 序號    刪除任務(wù)
    
  • 示例

    交互式:
    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
    
    查看任務(wù):
    atq
    

長期任務(wù)

  • 基本命令

    創(chuàng)建、編輯計劃任務(wù):crontab -e [-u 用戶名]
    查看計劃任務(wù):crontab -l [-u 用戶名]
    刪除計劃任務(wù):crontab -r [-u 用戶名]
    
  • 創(chuàng)建參數(shù)
    crontab參數(shù)
    crontab參數(shù)
  • 示例赌厅,每周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
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末特愿,一起剝皮案震驚了整個濱河市仲墨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揍障,老刑警劉巖目养,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毒嫡,居然都是意外死亡癌蚁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門兜畸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來努释,“玉大人,你說我怎么就攤上這事咬摇》サ伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵肛鹏,是天一觀的道長逸邦。 經(jīng)常有香客問我,道長在扰,這世上最難降的妖魔是什么缕减? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮芒珠,結(jié)果婚禮上桥狡,老公的妹妹穿的比我還像新娘。我一直安慰自己妓局,他們只是感情好总放,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著好爬,像睡著了一般局雄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上存炮,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天炬搭,我揣著相機與錄音,去河邊找鬼穆桂。 笑死宫盔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的享完。 我是一名探鬼主播灼芭,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼般又!你這毒婦竟也來了彼绷?” 一聲冷哼從身側(cè)響起巍佑,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寄悯,沒想到半個月后萤衰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡猜旬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年脆栋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洒擦。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡椿争,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熟嫩,到底是詐尸還是另有隱情丘薛,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布邦危,位于F島的核電站洋侨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倦蚪。R本人自食惡果不足惜希坚,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陵且。 院中可真熱鬧裁僧,春花似錦、人聲如沸慕购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪悲。三九已至获洲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殿如,已是汗流浹背贡珊。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涉馁,地道東北人门岔。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像烤送,于是被迫代替她去往敵國和親寒随。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

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