??我們在第一次作為運維人員去學習和寫shell腳本的時候,我們經常會做什么,我們把我們在?? Linux上面去執(zhí)行的那些命令,我們一股腦的全部把它丟到shell腳本里面來。??
舉個例子就是說我們要做什么,??我們先用 Linux 系統(tǒng)上面,先在 Linux 系統(tǒng)上面先演示,我們先到宿主機目錄上面,??我們有個test目錄,我們先把它刪掉,
我們再看是不是沒有 test目錄了?
假設我們??登錄到這個系統(tǒng)上面,我們需要做一系列的步驟,??比如說我們第一件事情是什么叫mkdir test , 我們先新建這樣的一個目錄,然后我們再進入到?? test目錄里面去對不對?然后接著我們 ls 一下,這里什么都沒有, 最后的話我們再 touch 一個??比如說test點txt文件,我們新建的這樣一個文件,這個時候我們來看里面有一個test點txt文件,??然后我們輸入一個什么hello word是吧?我們輸入這樣的內容把它導入到 text點txt文本里面,??接著的話我們再 cat 一下 test點txt,
假設我們收工了,我們要退出了之后,這個目錄還在,我們還要做一個什么事情,我們要把它?? rm -rf test/ ,我們把它刪掉。
假設我們要在每臺節(jié)點上面都去這樣子操作一下,七八個步驟,做起來還是至少要個九秒八秒五秒對吧?假設我們現(xiàn)在就要寫腳本,??在腳本里面能夠實現(xiàn)這種自動化操作,我們直接運行的腳本就把我們剛才的事情都做了,??我們怎么寫?
我們首先第一步就是#!/bin/bash,默認寫在里面, 第一步我們做什么?我們要先跳到宿主機目錄上面來,對不對?我們用 cd ~,這個~表示宿主機目錄,如果是對于 root 用戶的話,它的宿主目錄是什么?是/root目錄。??
如果是其他普通用戶,波浪線~表示的是什么???表示的是/home/用戶名,~ 它其實是有兩種表示含義,如果說你是root的話,波浪線~表示的是/root目錄這個路徑,?? 如果是其他普通用戶的話,那么這個波浪線~表示就是/home/用戶名。
我們先進到宿主目錄之后,然后我們是不是mkdir test創(chuàng)建了一個test目錄是吧?接著的話我們是不是要進入到 text目錄里面去,cd test
接著我們做了一個什么事情,我們是不是創(chuàng)建了一個test點txt文件,touch test.txt然后我們輸出重定向,我們再往里面寫了一行 hello,world,到text文本里面去,echo "htllo,world" >> test.txt
然后接著我們做了一個什么事情,cat test.txt, 之后做什么,我們再跳出來,??跳到上一級目錄,cd ..
接著我們就 rm -rf test,把整個目錄移除/刪掉,??
這是我們剛剛做的動作,我們把所有的動作命令,我們所有執(zhí)行的操作我們全部放到這來。??
接著的話我們希望到另外一個節(jié)點,我們做同樣的事情的時候,我們就只需要執(zhí)行一下這個腳本, 我們看一下我們這個代碼有沒有傳過來,代碼已經全部傳過來了,
接著的話我們來做一個什么事情,我們要執(zhí)行一下,??
chmod +x second.sh 權限也一樣,然后./second.sh
執(zhí)行腳本它輸出hello,world, hello,world 是哪里輸出來的???cat test.txt就輸出了,
但是整個過程我們其實沒有感知到,我們看到這下面并沒有 test的目錄創(chuàng)建,
相當于我們執(zhí)行這一項,??可能不到一秒鐘我們就執(zhí)行了剛才這么多的步驟, 經常的我們到一個系統(tǒng)上面去部署一個服務的時候,??步驟都是一樣的, 比如我們先把原來的服務先停掉,然后把原來的整個目錄備份,??備份了之后,然后把我們的新包拷到里面去,拷到某個目錄里面,然后解壓, 然后執(zhí)行里面的啟動腳本,這樣子就可以了。??
我們這個步驟其實相當于就是把運維人員里面寫的那些腳本一步一步寫到這里面來,??這就是一個命令堆積的過程。但是這樣的一個腳本會不會有問題, 舉個例子,比如說??我們這里是不是兩次出現(xiàn)了text, 我們假設我們要換一個目錄,我們要換一個text1,我們創(chuàng)建一個tes,1目錄的話,??我們這里是不是要改一下,這里要改一下,還有這里再改一下,我們要改三個地方, 我們如果有編程經驗的人的話,我們就知道我們說把這種共同的東西,我們抽象出來,我們寫一個變量,??比如部署任務叫DEPLOY_DIR=test, 我們就叫做test,假設我們這里創(chuàng)建的時候,這個時候我們創(chuàng)建就用變量名用$DEPLOY_DIR去代替,??使用變量的時候一定要在前面加上多樂符$, 然后比如說我們 cd 也用變量名$DEPLOY_DIR代替,然后最后的rm -rf也把它用$DEPLOY_DIR代替。??
這樣子的話,假設我要創(chuàng)建一個test2,我們只要改這里就可以了,這是第一點,我們把它這些東西變成了變量。??
創(chuàng)建的文件,假設我們叫 USE_FILE=text.txt, 我們把我們接下來會用到的創(chuàng)建的文件把它改一下,??導入到$USE_FILE里面來, 然后我cat也是這樣 cat $USE_FILE,?? 我們就是用變量實現(xiàn)了一個改造,優(yōu)化了一下腳本,??這樣的話如果說腳本想要比如說我要創(chuàng)建換一個新的目錄,或者說??我導入到不同的文件的時候, 我們只需要改一處地方就可以了。??這樣的話整個腳本稍微會好一點,比如說免得你變量相同的值到處寫,??假設如果說是另外一個人維護的時候,我要改一下,可能他只改了一處地方,你還有其他幾處地方沒有改的話,腳本執(zhí)行就會有問題,??
我們腳本盡量的把一些經常用的地方我們要抽成變量,??其他編程語言它都要做的一個事情,就是不要讓一個特殊的值在整個代碼的文件里面到處跑。??
好,這樣子的話,我們接下來這個代碼還有沒有需要改造的,當然肯定是有。?? 首先我們??這樣一點我們要注意一下,首先第一個是我們創(chuàng)建 test目錄,你說有沒有可能會失????? 假如失敗了之后,假設我們說原來我們有 test目錄對不對?我們有 text目錄,我們這里創(chuàng)建失敗了,??你就要記住一點,這個腳本你即使命令執(zhí)行失敗了,它的腳本默認會繼續(xù)執(zhí)行下去了。??假設這是別人的目錄,??我要創(chuàng)建一個目錄的時候,我發(fā)現(xiàn)創(chuàng)建了別人的目錄,??別人的目錄它存在導致我們命令失敗了,但是我們這個命令并不會停下來,它會往下走走走到這里:
它會把別人的整個目錄全部給刪掉,??這樣子就會帶來一個什么問題。??我把別人的東西給刪掉了,而且是rm -rf,這個命令也要在生產環(huán)境里面一定要注意,所謂網上調侃從刪庫跑路,就是說你用的這個rm -rf / ,/ 就是根目錄。??你把從根目錄開始下的所有的文件,假設你有宿主權限的話,就一口氣全部給它刪干凈了,??好家伙,這臺機器基本上就廢掉了,所以這個時候的話不是你被公司開除,就是公司要把你給抓到什么監(jiān)獄里面去,??
所以說這個命令很危險,??而且你這樣子假設即使你這里用了 test是吧,刪的是別人的目錄,??那也可能會造成一定很大的一個影響,對不對???假設我就說我把這里??改成根目錄或者改成 etc:
這些都是重要配置文件,你刪了之后,??你再重啟一下機器的時候,你就發(fā)現(xiàn)它起不起來了,也就是說 mkdir創(chuàng)建失敗,它其實會造成一個什么???就是說失敗了的話,我希望ta能夠不要執(zhí)行下去。??shell里面會有這樣的一個操作,就是 set -e,??set +e表示的是命令遇到錯誤會繼續(xù)執(zhí)行,遇到錯誤會繼續(xù)執(zhí)行,??set -e表示的就是遇到錯誤停止運行。??
我們可以試一下,
比如說我們刪除這個目錄,我們只是打印提示信息說一下,并不真正的做刪除目錄。?? 如果是第一次執(zhí)行了之后,這個目錄還是存在的。??接著我們再次執(zhí)行第二次的時候,我們注釋一下,
好,我們來跑一下腳本,??
這個時候它輸出了 hello world,同時刪除這個目錄,但是這個目錄是沒有被刪除的,我們先看一下:
有test目錄對不對?它存在??。
接著的話我們再次執(zhí)行:
大家看到無法創(chuàng)建目錄,文件已經存在,??我輸出了兩個hello world,是因為原來已經追加的一個hello world在里面,然后又來一個hello world,但是我又執(zhí)行了刪除目錄,??也就是說我們沒有默認的情況下,命令報錯了,它會繼續(xù)往下執(zhí)行對不對???
假設我們把第3行注釋取消,我們再看一下,
我們再次執(zhí)行的時候,我們可以看到:
mkdir 這里命令報錯了之后,后面的cat什么刪除這些提示信息【刪除test目錄】都沒有被執(zhí)行了,也就是說我們可以通過??這樣的一個方式去控制命令,就是遇到錯誤之后要不要繼續(xù)執(zhí)行,??我們可以簡單的這樣設置一下,這是shell里面的一個規(guī)范規(guī)則。??
接著的話我們還可以做一個什么事情??? 比如說我們的 test或者文件,我們都可以從外面的去傳,??
代碼:
解讀代碼:假設我們還可以做一個什么事情,我們的目錄??我們可以通過腳本自己傳入,多了符號$表示從腳本外面?zhèn)鞯?a target="_blank">參數(shù),?? 假設我們是 -eq 1,?? 然后 我們用一下 if,后面我們會專門去介紹這個if語句的判斷語句怎么用,就是說我們腳本如果是傳入了一個,?? 然后我們先給一個默認值,【第5行】
如果說我們的參數(shù)傳來一個值,??就先把第一個參數(shù)當做是要創(chuàng)建的部署的目錄, 假設我們傳入了腳本, 假設第一個參數(shù)是xx,我們傳了一個xxx的時候,它表示了一個位置參數(shù),它就在多了一的位置上面,??如果有的話,我們就把 xxx 這個值賦給這個變量$1,【第9行】
假設我們這里還有一個yyy??的話,這就是第二個參數(shù)。?? 如果說是它的參數(shù)的個數(shù)等于2的話,我們就會把??第二個參數(shù)傳給 $2,即USER_FILE變量,【第14行】
我們用 echo 輸出提示信息【第24行】
也就是說我們這里是加了兩個if,可以通過外部的參數(shù)來控制這兩個變量的值。??
大概的邏輯就這些。
審核編輯:劉清
-
Linux系統(tǒng)
+關注
關注
4文章
593瀏覽量
27403 -
Shell
+關注
關注
1文章
365瀏覽量
23379 -
root
+關注
關注
1文章
86瀏覽量
21393
發(fā)布評論請先 登錄
相關推薦
評論