0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Shell命令編程實踐指南

冬至配餃子 ? 來源:基根奮斗營 ? 作者:keagen ? 2022-08-19 13:10 ? 次閱讀

??我們在第一次作為運維人員去學習和寫shell腳本的時候,我們經常會做什么,我們把我們在?? Linux上面去執(zhí)行的那些命令,我們一股腦的全部把它丟到shell腳本里面來。??

舉個例子就是說我們要做什么,??我們先用 Linux 系統(tǒng)上面,先在 Linux 系統(tǒng)上面先演示,我們先到宿主機目錄上面,??我們有個test目錄,我們先把它刪掉,

pYYBAGL_GTaAaPVWAABMkou12p4971.png

我們再看是不是沒有 test目錄了?

假設我們??登錄到這個系統(tǒng)上面,我們需要做一系列的步驟,??比如說我們第一件事情是什么叫mkdir test , 我們先新建這樣的一個目錄,然后我們再進入到?? test目錄里面去對不對?然后接著我們 ls 一下,這里什么都沒有, 最后的話我們再 touch 一個??比如說test點txt文件,我們新建的這樣一個文件,這個時候我們來看里面有一個test點txt文件,??然后我們輸入一個什么hello word是吧?我們輸入這樣的內容把它導入到 text點txt文本里面,??接著的話我們再 cat 一下 test點txt,

poYBAGL_GUuAPQA5AADA91aLYxY144.png

假設我們收工了,我們要退出了之后,這個目錄還在,我們還要做一個什么事情,我們要把它?? rm -rf test/ ,我們把它刪掉。

poYBAGL_GWOAKvh1AAC7xRjWUEE066.png

假設我們要在每臺節(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í)行的操作我們全部放到這來。??

pYYBAGL_GXqARDefAABbNA5nWYQ015.png

接著的話我們希望到另外一個節(jié)點,我們做同樣的事情的時候,我們就只需要執(zhí)行一下這個腳本, 我們看一下我們這個代碼有沒有傳過來,代碼已經全部傳過來了,

pYYBAGL_GY-AehHxAAB2Ok2HwYI415.png

接著的話我們來做一個什么事情,我們要執(zhí)行一下,??

poYBAGL_GaiAUXV1AABQZceZy-A594.png

chmod +x second.sh 權限也一樣,然后./second.sh

執(zhí)行腳本它輸出hello,world, hello,world 是哪里輸出來的???cat test.txt就輸出了,

但是整個過程我們其實沒有感知到,我們看到這下面并沒有 test的目錄創(chuàng)建,

poYBAGL_Gb-Aca0aAABMlp_YR7A704.png

相當于我們執(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,我們只要改這里就可以了,這是第一點,我們把它這些東西變成了變量。??

pYYBAGL_GdaAZMoTAABbG611H68686.png

創(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)建了別人的目錄,??別人的目錄它存在導致我們命令失敗了,但是我們這個命令并不會停下來,它會往下走走走到這里:

poYBAGL_GfCAaYfgAAD6PoVqxeA267.png

它會把別人的整個目錄全部給刪掉,??這樣子就會帶來一個什么問題。??我把別人的東西給刪掉了,而且是rm -rf,這個命令也要在生產環(huán)境里面一定要注意,所謂網上調侃從刪庫跑路,就是說你用的這個rm -rf / ,/ 就是根目錄。??你把從根目錄開始下的所有的文件,假設你有宿主權限的話,就一口氣全部給它刪干凈了,??好家伙,這臺機器基本上就廢掉了,所以這個時候的話不是你被公司開除,就是公司要把你給抓到什么監(jiān)獄里面去,??

所以說這個命令很危險,??而且你這樣子假設即使你這里用了 test是吧,刪的是別人的目錄,??那也可能會造成一定很大的一個影響,對不對???假設我就說我把這里??改成根目錄或者改成 etc:

pYYBAGL_GgaAJGVtAACNET4iW-A916.png

這些都是重要配置文件,你刪了之后,??你再重啟一下機器的時候,你就發(fā)現(xiàn)它起不起來了,也就是說 mkdir創(chuàng)建失敗,它其實會造成一個什么???就是說失敗了的話,我希望ta能夠不要執(zhí)行下去。??shell里面會有這樣的一個操作,就是 set -e,??set +e表示的是命令遇到錯誤會繼續(xù)執(zhí)行,遇到錯誤會繼續(xù)執(zhí)行,??set -e表示的就是遇到錯誤停止運行。??

我們可以試一下,

pYYBAGL_GhqAR3taAACI8u6ivVM703.png

比如說我們刪除這個目錄,我們只是打印提示信息說一下,并不真正的做刪除目錄。?? 如果是第一次執(zhí)行了之后,這個目錄還是存在的。??接著我們再次執(zhí)行第二次的時候,我們注釋一下,

pYYBAGL_Gi2AIl3NAACtN6ZkKVE388.png

好,我們來跑一下腳本,??

poYBAGL_GkSAAsORAABiHQBv6UI351.png

這個時候它輸出了 hello world,同時刪除這個目錄,但是這個目錄是沒有被刪除的,我們先看一下:

pYYBAGL_GlmAeKBEAABD3bW91J8076.png

有test目錄對不對?它存在??。

接著的話我們再次執(zhí)行:

pYYBAGL_GmyACjjsAABiK-eBjA0758.png

大家看到無法創(chuàng)建目錄,文件已經存在,??我輸出了兩個hello world,是因為原來已經追加的一個hello world在里面,然后又來一個hello world,但是我又執(zhí)行了刪除目錄,??也就是說我們沒有默認的情況下,命令報錯了,它會繼續(xù)往下執(zhí)行對不對???

假設我們把第3行注釋取消,我們再看一下,

poYBAGL_GoGAM_NbAACPZavs560852.png

我們再次執(zhí)行的時候,我們可以看到:

pYYBAGL_GpSAOtglAABtPUAVTW8656.png

mkdir 這里命令報錯了之后,后面的cat什么刪除這些提示信息【刪除test目錄】都沒有被執(zhí)行了,也就是說我們可以通過??這樣的一個方式去控制命令,就是遇到錯誤之后要不要繼續(xù)執(zhí)行,??我們可以簡單的這樣設置一下,這是shell里面的一個規(guī)范規(guī)則。??

接著的話我們還可以做一個什么事情??? 比如說我們的 test或者文件,我們都可以從外面的去傳,??

poYBAGL_GqiAZKBtAACmv7unOQw772.png

代碼:

pYYBAGL_Gs6AOkQqAAGsXOYb-u0094.pngpoYBAGL_GtOABgyfAACd_e6NoU0719.png

解讀代碼:假設我們還可以做一個什么事情,我們的目錄??我們可以通過腳本自己傳入,多了符號$表示從腳本外面?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ù)來控制這兩個變量的值。??

大概的邏輯就這些。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux系統(tǒng)

    關注

    4

    文章

    593

    瀏覽量

    27403
  • Shell
    +關注

    關注

    1

    文章

    365

    瀏覽量

    23379
  • root
    +關注

    關注

    1

    文章

    86

    瀏覽量

    21393
收藏 人收藏

    評論

    相關推薦

    shell編程的簡單命令語句了解

    shell(腳本:批處理)適合職業(yè):Linux系統(tǒng)運維工程師1.命令解析器(將用戶輸入的命令解析,調用相應的命令的可執(zhí)行文件)2.腳本語言我們需要了解的是
    發(fā)表于 11-04 08:00

    linux shell命令/unix shell命令教程

    linux shell命令/unix shell命令教程:為了防止未授權用戶訪問你的文件,可以在文件和目錄上設置權限位。還可以設定文件在創(chuàng)建時所具有的缺省權限:這些只是整個系統(tǒng)安全問題
    發(fā)表于 12-06 13:08 ?61次下載
    linux <b class='flag-5'>shell</b><b class='flag-5'>命令</b>/unix <b class='flag-5'>shell</b><b class='flag-5'>命令</b>教程

    《Linux命令、編輯器和shell編程(第2版)》源代碼

    想學好linux命令行使用,以及shell編程的同學可以看看
    發(fā)表于 10-30 17:14 ?0次下載

    unix的shell命令是什么

    Unix shell,通常被稱作“命令行”,為Unix和類Unix操作系統(tǒng)提供了傳統(tǒng)的用戶界面。用戶通過輸入shell所執(zhí)行的命令,引導計算機的操作。在微軟Windows操作系統(tǒng)平臺,
    發(fā)表于 11-14 14:43 ?4596次閱讀
    unix的<b class='flag-5'>shell</b><b class='flag-5'>命令</b>是什么

    Linux教程之Linux命令、編程器、Shell編程、實例大全pdf免費下載

    本書全面、系統(tǒng)地介紹了Linux命令、編輯器及Shell編程的相關內容。既便于讀者深入了解Linux命令強大的功能,又可以幫助Linux用戶在較短的時間內學習和掌握Shel
    發(fā)表于 01-08 14:55 ?20次下載
    Linux教程之Linux<b class='flag-5'>命令</b>、<b class='flag-5'>編程</b>器、<b class='flag-5'>Shell</b><b class='flag-5'>編程</b>、實例大全pdf免費下載

    Shell內建命令:exit命令

    1.簡介 exit 命令Shell 內建命令,用于退出當前 Shell 進程。 2.命令格式 exit ?N (1)狀態(tài)碼 N 的范圍是
    的頭像 發(fā)表于 02-02 10:45 ?3987次閱讀

    Linux系統(tǒng)命令shell腳本實踐指南

    Linux系統(tǒng)命令shell腳本實踐指南資料下載。
    發(fā)表于 06-01 14:47 ?28次下載

    嵌入式Linux開發(fā)工具——shell編程

    shell(腳本:批處理)適合職業(yè):Linux系統(tǒng)運維工程師1.命令解析器(將用戶輸入的命令解析,調用相應的命令的可執(zhí)行文件)2.腳本語言我們需要了解的是
    發(fā)表于 11-01 17:20 ?13次下載
    嵌入式Linux開發(fā)工具——<b class='flag-5'>shell</b><b class='flag-5'>編程</b>

    【Makefile】Makefile與shell命令的聯(lián)系

    博主最近在項目實踐過程中,需要深度定制項目的Makefile,其中有些復雜的流程必須得借助shell腳本才能高效地完成,為此博主特意深入學習了在Makefile種調用shell命令的方
    的頭像 發(fā)表于 07-11 09:06 ?3491次閱讀
    【Makefile】Makefile與<b class='flag-5'>shell</b><b class='flag-5'>命令</b>的聯(lián)系

    Shell命令行解釋器簡介

    Shell 是一個命令行解釋器,Shell 為用戶提供了與設備進行命令行交互的方式,用戶通過串口、以太網、無線等方式將命令傳輸給具有
    的頭像 發(fā)表于 08-19 17:20 ?3229次閱讀

    shell腳本本身自帶的命令詳解

    除了以文件形式保存在/usr/bin下面的命令,shell腳本中還可以使用shell本身自帶的命令,即內置命令
    的頭像 發(fā)表于 05-23 09:32 ?1039次閱讀
    <b class='flag-5'>shell</b>腳本本身自帶的<b class='flag-5'>命令</b>詳解

    shell腳本基本命令

    Shell腳本是一種可執(zhí)行文件,它包含了一組用某種特定語言編寫的命令,這些命令可以被解釋器(如bash)執(zhí)行。以下是一些常見的shell腳本基本命令
    的頭像 發(fā)表于 11-08 10:08 ?2158次閱讀

    shell命令和linux命令一樣嗎

    Shell命令和Linux命令并不完全一樣。 首先,Shell是一種命令行解釋器,它是用來解釋和執(zhí)行用戶輸入的
    的頭像 發(fā)表于 11-08 10:51 ?2877次閱讀

    linux命令shell編程有什么聯(lián)系

    Linux命令Shell編程之間存在密切的聯(lián)系。 首先,Shell是Linux命令行下的解釋器,它提供了一個用戶界面,使用戶能夠與Linu
    的頭像 發(fā)表于 11-08 10:53 ?930次閱讀

    linux命令行與shell編程實戰(zhàn)

    Linux命令行與Shell編程實戰(zhàn)主要涉及以下內容: Linux命令行基礎:學習Linux命令行的基本操作,如文件管理、進程管理、網絡配置
    的頭像 發(fā)表于 11-08 10:57 ?773次閱讀