溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux系統(tǒng)Bash(Shell)基礎(chǔ)知識(2)

發(fā)布時(shí)間:2020-09-07 09:44:51 來源:網(wǎng)絡(luò) 閱讀:403 作者:wujunqi1996 欄目:開發(fā)技術(shù)

  關(guān)于shell腳本的應(yīng)用上次已經(jīng)對一些較基本的內(nèi)容進(jìn)行闡述,在此對shell腳本進(jìn)行更進(jìn)一步的了解--shell腳本的編程。

  在講述shell腳本的編程之前,先講述一下關(guān)于編程語言的概念;

  編程語言可分為高級語言,低級語言,機(jī)器語言;

  區(qū)分的依據(jù)是離硬件的遠(yuǎn)近,效率高級語言是編程語言中最接近人類自然語言的一種語言,轉(zhuǎn)化成計(jì)算機(jī)能夠理解的機(jī)器語言的效率就低,而低級語言也就是匯編語言,作為較靠近機(jī)器語言的語言,轉(zhuǎn)化成計(jì)算機(jī)能夠理解的機(jī)器語言的效率就高;機(jī)器語言作為最接近計(jì)算機(jī)底層大量物理硬件的語言,為了能讓用戶在使用計(jì)算機(jī)的時(shí)候以非交互式的方式完成某些任務(wù),需要將這些編制成一個(gè)文件,讓計(jì)算機(jī)順序讀取,從而實(shí)現(xiàn)功能;人們利用高級語言,這種比較接近人類的自然語言編寫代碼,進(jìn)行編譯,轉(zhuǎn)化成匯編語言,再由編譯器轉(zhuǎn)換成計(jì)算機(jī)能夠理解的機(jī)器語言去訪問在計(jì)算機(jī)最底層的大量的物理設(shè)備;用下面的路線可表示;

  編程語言:

        應(yīng)用級語言->系統(tǒng)級語言->微碼語言->機(jī)器語言

  高級語言:

  ①根據(jù)源代碼的處理方式分為:

  編譯運(yùn)行語言:

          根據(jù)高級語言寫出的源代碼,經(jīng)過編譯器編譯成微碼語言也就是匯編語言,匯編語言再           使用匯編器將匯編語言轉(zhuǎn)化成二進(jìn)制代碼即機(jī)器語言,計(jì)算機(jī)再根據(jù)機(jī)器語言所表達(dá)的           內(nèi)容,將代碼轉(zhuǎn)化成可以直接執(zhí)行的二進(jìn)制文件。

  解釋運(yùn)行語言:

          根據(jù)高級語言編寫的源程序可以直接啟動(dòng)跟源代碼對應(yīng)的解釋器程序,再由解釋器一邊           解釋一邊執(zhí)行;

  ②根據(jù)其編程過程中的功能的實(shí)現(xiàn)是調(diào)用庫還是調(diào)用外部程序文件:

  完整編程語言:

          利用庫或編程組件進(jìn)行編輯;

  腳本編程語言:

          解釋器,shell腳本,調(diào)用shell程序其次調(diào)用需要的外部命令文件,命令解釋器提供了           單一功能的編程接口,過程式編程邏輯的支持;

  ③根據(jù)程序的編寫范式:程序=指令+數(shù)據(jù)

  過程式編程語言:

           以指令為中心,圍繞指令(算法)的實(shí)現(xiàn)設(shè)計(jì)數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)是要為指令服務(wù)            的;

  對象式編程語言:

           以數(shù)據(jù)為中心,將數(shù)據(jù)實(shí)例化為類,圍繞著數(shù)據(jù)的需求來部署指令,類,屬性(描述             某個(gè)類中的具體對象),方法;

  

  Linux的shell編程作為一種高級程序設(shè)計(jì)語言,是個(gè)解釋性語言,不需要編譯它有變量,關(guān)鍵字和各種順序,選擇,循環(huán)的控制語句,如if,else,while,continue,break等語句,也支持函數(shù)模塊,有自己的語法結(jié)構(gòu);

  shell腳本的特點(diǎn):

  1.shell腳本的編寫都需要在文本文檔中編寫,通過調(diào)用當(dāng)前文本文檔調(diào)用shell腳本;

  2.shell腳本是以許多命令的組合,由各種控制語句結(jié)合;

  3.“執(zhí)行冪等性”--任何命令多次執(zhí)行的結(jié)果是一樣的

  注意:很多命令都不具備“執(zhí)行冪等性”,在shell腳本中就需要使用大量的程序邏輯來判斷某個(gè)命令是否滿足其運(yùn)行條件,以避免在運(yùn)行過程中出現(xiàn)嚴(yán)重錯(cuò)誤;

 

  在編寫shell腳本的過程當(dāng)中,第一行的絕對行首必須是解釋器的路徑即shebang,當(dāng)前shell腳本的命令的運(yùn)行需要在哪個(gè)解釋器的解釋下運(yùn)行,解釋器的解釋需要逐條解釋,解釋執(zhí)行一條命令后才能解釋執(zhí)行下一條命令;否則會(huì)出現(xiàn)解釋錯(cuò)誤,無法往下執(zhí)行;解釋器的路徑為“#!”開頭,而在shell腳本中“#”表示當(dāng)前shell腳本的注釋,注釋必須放在當(dāng)前行的絕對行首,shell腳本在運(yùn)行時(shí)會(huì)忽略這樣的內(nèi)容;

  例如:

  #!/bin/bash(執(zhí)行這個(gè)文件,并且用這個(gè)文件去解釋在文本文檔中所有的內(nèi)容)

  #!/bin/sh

  #!/usr/bin/python

  #!/usr/bin/perl

  # hello(注釋行)


  怎樣編寫shell腳本的內(nèi)容?

  我們可以利用多種文本編輯器來編寫shell腳本的內(nèi)容

  如vi,vim,nano,emacs,pico等;

  在次推薦使用vim,vim作為vi的升級版本,功能更加齊全,比vi方便許多,更重要的是,vim在shell腳本編寫的過程中可以使用高亮度的顏色標(biāo)識腳本中的變量,關(guān)鍵字,控制結(jié)構(gòu)的重要字符,可以在一定程度上檢測shell腳本的正確度;

  shell腳本的運(yùn)行方法有:

  ①

  直接運(yùn)行shell腳本的路徑:

  例如

  $./usr/men   //這樣可以直接運(yùn)行在當(dāng)前目錄下的文本文件中的shell腳本內(nèi)容

  注意:在使用上述方式調(diào)用時(shí),必須需為當(dāng)前shell腳本賦予執(zhí)行的權(quán)限;

  如 chmod u+x 。/usr/men

  ②

  以腳本名作為bash參數(shù),其一般形式是:

  $bash 腳本名 [參數(shù)]

  其好處是一個(gè)shell腳本可以處理多種情況;

  ③將shell腳本的權(quán)限定義為可執(zhí)行,將其加入到PATH的執(zhí)行路徑中,直接調(diào)用shell腳本名:

  如果要把shell腳本名直接當(dāng)命令使用,首先要為shell腳本名賦予執(zhí)行權(quán)限,因?yàn)閟hell腳本文件都是文本文件,文本文件默認(rèn)都不具備執(zhí)行權(quán)限;

  如

  $chmod u+x ex2

  然后將腳本所在的目錄添加到命令搜索路徑PATH中

  $PATH=$PATH:./ex2

  把當(dāng)前工作目錄以“.”表示,添加到命令搜索路徑;這樣就可以直接執(zhí)行腳本文件名;

  $ex2

  

  shell腳本編寫的重要結(jié)構(gòu):

  多命令執(zhí)行結(jié)構(gòu):

  可以實(shí)現(xiàn)多條命令的結(jié)合,使多條命令共享資源;如“;”,“|”;冒號“;”可以將多條沒有關(guān)聯(lián)的命令聯(lián)合在一起執(zhí)行,而“|”管道線結(jié)構(gòu)能使上一條命令的輸出數(shù)據(jù)流,作為下一條命令的輸入數(shù)據(jù)流,簡單來說,“|”管道線的結(jié)構(gòu)命令之間需要具有某種關(guān)聯(lián)才可以實(shí)現(xiàn);

  如

  #COMMAND|COMMAND...

  #COMMAND;COMMAND...

  在多命令執(zhí)行結(jié)構(gòu)中有這幾種結(jié)構(gòu):

  選擇執(zhí)行結(jié)構(gòu):判斷是非正誤,采用“&&”,“||”,“!”的形式;

  邏輯運(yùn)算:

        與(AND):邏輯乘法&&,作為雙目運(yùn)算符;他放在兩個(gè)邏輯表達(dá)式中間,僅當(dāng)兩個(gè)表達(dá)式                為真時(shí),結(jié)果才為真;

           狀態(tài)返回值:0->success->true

                   1-255->fatlure->false

                   true&&true=true

                   true&&false=false

                   false&&true=false

                   false&&false=false

          “與”的短路邏輯運(yùn)算,只要第一個(gè)操作數(shù)為false,則其邏輯運(yùn)算的結(jié)果一定位false

          COMMAND1&&COMMAND2:如果第一個(gè)命令能成功執(zhí)行,則第二個(gè)命令才有必要執(zhí)行,如果           COMMAND1執(zhí)行失敗,則COMMAND2無法執(zhí)行;

        或(OR):邏輯加法||,作為雙目運(yùn)算符;他放在兩個(gè)邏輯表達(dá)式中間,其中只有一個(gè)表               達(dá)式為真,結(jié)果就為真

            true||true=true

            true||false=true

            false||true=true

            false||false=false

            只要第一個(gè)操作數(shù)為true則其邏輯運(yùn)算的結(jié)果一定為真;

            COMMAND1||COMMAND2(只要COMMAND1能夠成功執(zhí)行,后面的命令可以沒必要執(zhí)行,只             有當(dāng)COMMAND1執(zhí)行失敗時(shí),COMMAND2才會(huì)執(zhí)行)


        非(!):邏輯取反,!,作為單目運(yùn)算符;他放在邏輯表達(dá)式之前,使原來為真的表達(dá)               式變?yōu)榧伲乖瓉頌榧俚谋磉_(dá)式變?yōu)檎妫?/p>

            !string:讀取命令歷史空間的內(nèi)容,在此“!”代表的意義與非無關(guān);

            ! COMMAND:加空格,命令執(zhí)行狀態(tài)的取反

            !COMMAND1&&COMMAND2:相當(dāng)于COMMAND1||COMMAND2

            如果COMMAND1成功執(zhí)行則COMMAND2不需要執(zhí)行;

            如果COMMAND1不能成功執(zhí)行則COMMAND2需要執(zhí)行;

            !COMMAND1||COMMAND2:相當(dāng)于COMMAND1&&COMMAND2

            如果COMMAND1成功執(zhí)行則COMMAND2會(huì)被執(zhí)行;

            如果COMMAND1不能執(zhí)行則COMMAND2不會(huì)被執(zhí)行;

            邏輯運(yùn)算符優(yōu)先級:

            !>&&>|| 

        異或:比對兩個(gè)操作數(shù)的相同與否,如果不同則邏輯運(yùn)算結(jié)果為真,如果相同則為假;雙             目運(yùn)算符;

  

  

  



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI