99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

Shell命令編程實(shí)踐指南

冬至配餃子 ? 來源:基根奮斗營 ? 作者:keagen ? 2022-08-19 13:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

??我們?cè)诘谝淮巫鳛檫\(yùn)維人員去學(xué)習(xí)和寫shell腳本的時(shí)候,我們經(jīng)常會(huì)做什么,我們把我們?cè)?? Linux上面去執(zhí)行的那些命令,我們一股腦的全部把它丟到shell腳本里面來。??

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

pYYBAGL_GTaAaPVWAABMkou12p4971.png

我們?cè)倏词遣皇菦]有 test目錄了?

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

poYBAGL_GUuAPQA5AADA91aLYxY144.png

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

poYBAGL_GWOAKvh1AAC7xRjWUEE066.png

假設(shè)我們要在每臺(tái)節(jié)點(diǎn)上面都去這樣子操作一下,七八個(gè)步驟,做起來還是至少要個(gè)九秒八秒五秒對(duì)吧?假設(shè)我們現(xiàn)在就要寫腳本,??在腳本里面能夠?qū)崿F(xiàn)這種自動(dòng)化操作,我們直接運(yùn)行的腳本就把我們剛才的事情都做了,??我們?cè)趺磳懀?/p>

我們首先第一步就是#!/bin/bash,默認(rèn)寫在里面, 第一步我們做什么?我們要先跳到宿主機(jī)目錄上面來,對(duì)不對(duì)?我們用 cd ~,這個(gè)~表示宿主機(jī)目錄,如果是對(duì)于 root 用戶的話,它的宿主目錄是什么?是/root目錄。??

如果是其他普通用戶,波浪線~表示的是什么???表示的是/home/用戶名,~ 它其實(shí)是有兩種表示含義,如果說你是root的話,波浪線~表示的是/root目錄這個(gè)路徑,?? 如果是其他普通用戶的話,那么這個(gè)波浪線~表示就是/home/用戶名。

我們先進(jìn)到宿主目錄之后,然后我們是不是mkdir test創(chuàng)建了一個(gè)test目錄是吧?接著的話我們是不是要進(jìn)入到 text目錄里面去,cd test

接著我們做了一個(gè)什么事情,我們是不是創(chuàng)建了一個(gè)test點(diǎn)txt文件,touch test.txt然后我們輸出重定向,我們?cè)偻锩鎸懥艘恍?hello,world,到text文本里面去,echo "htllo,world" >> test.txt

然后接著我們做了一個(gè)什么事情,cat test.txt, 之后做什么,我們?cè)偬鰜恚??跳到上一級(jí)目錄,cd ..

接著我們就 rm -rf test,把整個(gè)目錄移除/刪掉,??

這是我們剛剛做的動(dòng)作,我們把所有的動(dòng)作命令,我們所有執(zhí)行的操作我們?nèi)糠诺竭@來。??

pYYBAGL_GXqARDefAABbNA5nWYQ015.png

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

pYYBAGL_GY-AehHxAAB2Ok2HwYI415.png

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

poYBAGL_GaiAUXV1AABQZceZy-A594.png

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

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

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

poYBAGL_Gb-Aca0aAABMlp_YR7A704.png

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

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

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

pYYBAGL_GdaAZMoTAABbG611H68686.png

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

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

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

poYBAGL_GfCAaYfgAAD6PoVqxeA267.png

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

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

pYYBAGL_GgaAJGVtAACNET4iW-A916.png

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

我們可以試一下,

pYYBAGL_GhqAR3taAACI8u6ivVM703.png

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

pYYBAGL_Gi2AIl3NAACtN6ZkKVE388.png

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

poYBAGL_GkSAAsORAABiHQBv6UI351.png

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

pYYBAGL_GlmAeKBEAABD3bW91J8076.png

有test目錄對(duì)不對(duì)?它存在??。

接著的話我們?cè)俅螆?zhí)行:

pYYBAGL_GmyACjjsAABiK-eBjA0758.png

大家看到無法創(chuàng)建目錄,文件已經(jīng)存在,??我輸出了兩個(gè)hello world,是因?yàn)樵瓉硪呀?jīng)追加的一個(gè)hello world在里面,然后又來一個(gè)hello world,但是我又執(zhí)行了刪除目錄,??也就是說我們沒有默認(rèn)的情況下,命令報(bào)錯(cuò)了,它會(huì)繼續(xù)往下執(zhí)行對(duì)不對(duì)???

假設(shè)我們把第3行注釋取消,我們?cè)倏匆幌拢?/p>

poYBAGL_GoGAM_NbAACPZavs560852.png

我們?cè)俅螆?zhí)行的時(shí)候,我們可以看到:

pYYBAGL_GpSAOtglAABtPUAVTW8656.png

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

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

poYBAGL_GqiAZKBtAACmv7unOQw772.png

代碼:

pYYBAGL_Gs6AOkQqAAGsXOYb-u0094.pngpoYBAGL_GtOABgyfAACd_e6NoU0719.png

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

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

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

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

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

大概的邏輯就這些。



審核編輯:劉清

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

    關(guān)注

    4

    文章

    605

    瀏覽量

    28618
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    372

    瀏覽量

    24221
  • root
    +關(guān)注

    關(guān)注

    1

    文章

    86

    瀏覽量

    21733
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    shell(腳本:批處理)適合職業(yè):Linux系統(tǒng)運(yùn)維工程師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)建時(shí)所具有的缺省權(quán)限:這些只是整個(gè)系統(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)計(jì)算機(jī)的操作。在微軟Windows操作系統(tǒng)平臺(tái),
    發(fā)表于 11-14 14:43 ?4846次閱讀
    unix的<b class='flag-5'>shell</b><b class='flag-5'>命令</b>是什么

    Linux教程之Linux命令、編程器、Shell編程、實(shí)例大全pdf免費(fèi)下載

    本書全面、系統(tǒng)地介紹了Linux命令、編輯器及Shell編程的相關(guān)內(nèi)容。既便于讀者深入了解Linux命令強(qiáng)大的功能,又可以幫助Linux用戶在較短的時(shí)間內(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>、實(shí)例大全pdf免費(fèi)下載

    Shell內(nèi)建命令:exit命令

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

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

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

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

    shell(腳本:批處理)適合職業(yè):Linux系統(tǒng)運(yùn)維工程師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)系

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

    Shell命令行解釋器簡介

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

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

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

    shell腳本基本命令

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

    shell命令和linux命令一樣嗎

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

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

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

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

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