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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Shell命令編程實踐指南

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

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

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

pYYBAGL_GTaAaPVWAABMkou12p4971.png

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

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

poYBAGL_GUuAPQA5AADA91aLYxY144.png

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

poYBAGL_GWOAKvh1AAC7xRjWUEE066.png

假設(shè)我們要在每臺節(jié)點上面都去這樣子操作一下,七八個步驟,做起來還是至少要個九秒八秒五秒對吧?假設(shè)我們現(xiàn)在就要寫腳本,??在腳本里面能夠?qū)崿F(xiàn)這種自動化操作,我們直接運行的腳本就把我們剛才的事情都做了,??我們怎么寫?

我們首先第一步就是#!/bin/bash,默認(rèn)寫在里面, 第一步我們做什么?我們要先跳到宿主機目錄上面來,對不對?我們用 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í)行的操作我們?nèi)糠诺竭@來。??

pYYBAGL_GXqARDefAABbNA5nWYQ015.png

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

pYYBAGL_GY-AehHxAAB2Ok2HwYI415.png

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

poYBAGL_GaiAUXV1AABQZceZy-A594.png

chmod +x second.sh 權(quán)限也一樣,然后./second.sh

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

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

poYBAGL_Gb-Aca0aAABMlp_YR7A704.png

相當(dāng)于我們執(zhí)行這一項,??可能不到一秒鐘我們就執(zhí)行了剛才這么多的步驟, 經(jīng)常的我們到一個系統(tǒng)上面去部署一個服務(wù)的時候,??步驟都是一樣的, 比如我們先把原來的服務(wù)先停掉,然后把原來的整個目錄備份,??備份了之后,然后把我們的新包拷到里面去,拷到某個目錄里面,然后解壓, 然后執(zhí)行里面的啟動腳本,這樣子就可以了。??

我們這個步驟其實相當(dāng)于就是把運維人員里面寫的那些腳本一步一步寫到這里面來,??這就是一個命令堆積的過程。但是這樣的一個腳本會不會有問題, 舉個例子,比如說??我們這里是不是兩次出現(xiàn)了text, 我們假設(shè)我們要換一個目錄,我們要換一個text1,我們創(chuàng)建一個tes,1目錄的話,??我們這里是不是要改一下,這里要改一下,還有這里再改一下,我們要改三個地方, 我們?nèi)绻?a href="http://srfitnesspt.com/v/tag/1315/" target="_blank">編程經(jīng)驗的人的話,我們就知道我們說把這種共同的東西,我們抽象出來,我們寫一個變量,??比如部署任務(wù)叫DEPLOY_DIR=test, 我們就叫做test,假設(shè)我們這里創(chuàng)建的時候,這個時候我們創(chuàng)建就用變量名用$DEPLOY_DIR去代替,??使用變量的時候一定要在前面加上多樂符$, 然后比如說我們 cd 也用變量名$DEPLOY_DIR代替,然后最后的rm -rf也把它用$DEPLOY_DIR代替。??

這樣子的話,假設(shè)我要創(chuàng)建一個test2,我們只要改這里就可以了,這是第一點,我們把它這些東西變成了變量。??

pYYBAGL_GdaAZMoTAABbG611H68686.png

創(chuàng)建的文件,假設(shè)我們叫 USE_FILE=text.txt, 我們把我們接下來會用到的創(chuàng)建的文件把它改一下,??導(dǎo)入到$USE_FILE里面來, 然后我cat也是這樣 cat $USE_FILE,?? 我們就是用變量實現(xiàn)了一個改造,優(yōu)化了一下腳本,??這樣的話如果說腳本想要比如說我要創(chuàng)建換一個新的目錄,或者說??我導(dǎo)入到不同的文件的時候, 我們只需要改一處地方就可以了。??這樣的話整個腳本稍微會好一點,比如說免得你變量相同的值到處寫,??假設(shè)如果說是另外一個人維護的時候,我要改一下,可能他只改了一處地方,你還有其他幾處地方?jīng)]有改的話,腳本執(zhí)行就會有問題,??

我們腳本盡量的把一些經(jīng)常用的地方我們要抽成變量,??其他編程語言它都要做的一個事情,就是不要讓一個特殊的值在整個代碼的文件里面到處跑。??

好,這樣子的話,我們接下來這個代碼還有沒有需要改造的,當(dāng)然肯定是有。?? 首先我們??這樣一點我們要注意一下,首先第一個是我們創(chuàng)建 test目錄,你說有沒有可能會失?。?? 假如失敗了之后,假設(shè)我們說原來我們有 test目錄對不對?我們有 text目錄,我們這里創(chuàng)建失敗了,??你就要記住一點,這個腳本你即使命令執(zhí)行失敗了,它的腳本默認(rèn)會繼續(xù)執(zhí)行下去了。??假設(shè)這是別人的目錄,??我要創(chuàng)建一個目錄的時候,我發(fā)現(xiàn)創(chuàng)建了別人的目錄,??別人的目錄它存在導(dǎo)致我們命令失敗了,但是我們這個命令并不會停下來,它會往下走走走到這里:

poYBAGL_GfCAaYfgAAD6PoVqxeA267.png

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

所以說這個命令很危險,??而且你這樣子假設(shè)即使你這里用了 test是吧,刪的是別人的目錄,??那也可能會造成一定很大的一個影響,對不對???假設(shè)我就說我把這里??改成根目錄或者改成 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)建目錄,文件已經(jīng)存在,??我輸出了兩個hello world,是因為原來已經(jīng)追加的一個hello world在里面,然后又來一個hello world,但是我又執(zhí)行了刪除目錄,??也就是說我們沒有默認(rèn)的情況下,命令報錯了,它會繼續(xù)往下執(zhí)行對不對???

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

poYBAGL_GoGAM_NbAACPZavs560852.png

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

pYYBAGL_GpSAOtglAABtPUAVTW8656.png

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

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

poYBAGL_GqiAZKBtAACmv7unOQw772.png

代碼:

pYYBAGL_Gs6AOkQqAAGsXOYb-u0094.pngpoYBAGL_GtOABgyfAACd_e6NoU0719.png

解讀代碼:假設(shè)我們還可以做一個什么事情,我們的目錄??我們可以通過腳本自己傳入,多了符號$表示從腳本外面?zhèn)鞯?a target="_blank">參數(shù),?? 假設(shè)我們是 -eq 1,?? 然后 我們用一下 if,后面我們會專門去介紹這個if語句的判斷語句怎么用,就是說我們腳本如果是傳入了一個,?? 然后我們先給一個默認(rèn)值,【第5行】

如果說我們的參數(shù)傳來一個值,??就先把第一個參數(shù)當(dāng)做是要創(chuàng)建的部署的目錄, 假設(shè)我們傳入了腳本, 假設(shè)第一個參數(shù)是xx,我們傳了一個xxx的時候,它表示了一個位置參數(shù),它就在多了一的位置上面,??如果有的話,我們就把 xxx 這個值賦給這個變量$1,【第9行】

假設(shè)我們這里還有一個yyy??的話,這就是第二個參數(shù)。?? 如果說是它的參數(shù)的個數(shù)等于2的話,我們就會把??第二個參數(shù)傳給 $2,即USER_FILE變量,【第14行】

我們用 echo 輸出提示信息【第24行】

也就是說我們這里是加了兩個if,可以通過外部的參數(shù)來控制這兩個變量的值。??

大概的邏輯就這些。



審核編輯:劉清

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

    關(guān)注

    4

    文章

    588

    瀏覽量

    27266
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    361

    瀏覽量

    23234
  • root
    +關(guān)注

    關(guān)注

    1

    文章

    85

    瀏覽量

    21352
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    linux shell命令/unix shell命令教程

    linux shell命令/unix shell命令教程:為了防止未授權(quán)用戶訪問你的文件,可以在文件和目錄上設(shè)置權(quán)限位。還可以設(shè)定文件在創(chuàng)建時所具有的缺省權(quán)限:這些只是整個系統(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版)》源代碼

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

    unix的shell命令是什么

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

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

    本書全面、系統(tǒng)地介紹了Linux命令、編輯器及Shell編程的相關(guān)內(nèi)容。既便于讀者深入了解Linux命令強大的功能,又可以幫助Linux用戶在較短的時間內(nèi)學(xué)習(xí)和掌握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內(nèi)建命令:exit命令

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

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

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

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

    shell(腳本:批處理)適合職業(yè):Linux系統(tǒng)運維工程師1.命令解析器(將用戶輸入的命令解析,調(diào)用相應(yīng)的命令的可執(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,其中有些復(fù)雜的流程必須得借助shell腳本才能高效地完成,為此博主特意深入學(xué)習(xí)了在Makefile種調(diào)用shell命令的方
    的頭像 發(fā)表于 07-11 09:06 ?3247次閱讀
    【Makefile】Makefile與<b class='flag-5'>shell</b><b class='flag-5'>命令</b>的聯(lián)系

    Shell命令行解釋器簡介

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

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

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

    shell腳本基本命令

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

    shell命令和linux命令一樣嗎

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

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

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

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

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