日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

怎樣用 Bash 編程:語法和工具

 

讓我們通過本系列文章來學(xué)習(xí)基本的 Bash 編程語法和工具,以及如何使用變量和控制運(yùn)算符,這是三篇中的第一篇。-- David Both(作者)

Shell 是操作系統(tǒng)的命令解釋器,其中 Bash 是我最喜歡的。每當(dāng)用戶或者系統(tǒng)管理員將命令輸入系統(tǒng)的時(shí)候,linux 的 shell 解釋器就會(huì)把這些命令轉(zhuǎn)換成操作系統(tǒng)可以理解的形式。而執(zhí)行結(jié)果返回 shell 程序后,它會(huì)將結(jié)果輸出到 STDOUT(標(biāo)準(zhǔn)輸出),默認(rèn)情況下,這些結(jié)果會(huì) 顯示在你的終端 。所有我熟悉的 shell 同時(shí)也是一門編程語言。

Bash 是個(gè)功能強(qiáng)大的 shell,包含眾多便捷特性,比如:tab 補(bǔ)全、命令回溯和再編輯、別名等。它的命令行默認(rèn)編輯模式是 Emacs,但是我最喜歡的 Bash 特性之一是我可以將其更改為 Vi 模式,以使用那些儲(chǔ)存在我肌肉記憶中的的編輯命令。

然而,如果你把 Bash 當(dāng)作單純的 shell 來用,則無法體驗(yàn)它的真實(shí)能力。我在設(shè)計(jì)一套包含三卷的 Linux 自學(xué)課程 時(shí)(這個(gè)系列的文章正是基于此課程),了解到許多 Bash 的知識(shí),這些是我在過去 20 年的 Linux 工作經(jīng)驗(yàn)中所沒有掌握的,其中的一些知識(shí)就是關(guān)于 Bash 的編程用法。不得不說,Bash 是一門強(qiáng)大的編程語言,是一個(gè)能夠同時(shí)用于命令行和 shell 腳本的完美設(shè)計(jì)。

本系列文章將要探討如何使用 Bash 作為命令行界面(CLI)編程語言。第一篇文章簡單介紹 Bash 命令行編程、變量以及控制運(yùn)算符。其他文章會(huì)討論諸如:Bash 文件的類型;字符串、數(shù)字和一些邏輯運(yùn)算符,它們能夠提供代碼執(zhí)行流程中的邏輯控制;不同類型的 shell 擴(kuò)展;通過 for、while 和 until 來控制循環(huán)操作。

Shell

Bash 是 Bourne Again Shell 的縮寫,因?yàn)?Bash shell 是 基于 更早的 Bourne shell,后者是 Steven Bourne 在 1977 年開發(fā)的。另外還有很多 其他的 shell 可以使用,但下面四個(gè)是我經(jīng)常見到的:

  • csh:C shell 適合那些習(xí)慣了 C 語言語法的開發(fā)者。
  • ksh:Korn shell,由 David Korn 開發(fā),在 Unix 用戶中更流行。
  • tcsh:一個(gè) csh 的變種,增加了一些易用性。
  • zsh:Z shell,集成了許多其他流行 shell 的特性。

所有 shell 都有內(nèi)置命令,用以補(bǔ)充或替代核心工具集。打開 shell 的 man 說明頁,找到“BUILT-INS”那一段,可以查看都有哪些內(nèi)置命令。

每種 shell 都有它自己的特性和語法風(fēng)格。我用過 csh、ksh 和 zsh,但我還是更喜歡 Bash。你可以多試幾個(gè),尋找更適合你的 shell,盡管這可能需要花些功夫。但幸運(yùn)的是,切換不同 shell 很簡單。

所有這些 shell 既是編程語言又是命令解釋器。下面我們來快速瀏覽一下 Bash 中集成的編程結(jié)構(gòu)和工具。

做為編程語言的 Bash

大多數(shù)場景下,系統(tǒng)管理員都會(huì)使用 Bash 來發(fā)送簡單明了的命令。但 Bash 不僅可以輸入單條命令,很多系統(tǒng)管理員可以編寫簡單的命令行程序來執(zhí)行一系列任務(wù),這些程序可以作為通用工具,能節(jié)省時(shí)間和精力。

編寫 CLI 程序的目的是要提高效率(做一個(gè)“懶惰的”系統(tǒng)管理員)。在 CLI 程序中,你可以用特定順序列出若干命令,逐條執(zhí)行。這樣你就不用盯著顯示屏,等待一條命令執(zhí)行完,再輸入另一條,省下來的時(shí)間就可以去做其他事情了。

什么是“程序”?

自由在線計(jì)算機(jī)詞典( FOLDOC )對(duì)于程序的定義是:“由計(jì)算機(jī)執(zhí)行的指令,而不是運(yùn)行它們的物理硬件。”普林斯頓大學(xué)的 wordNet 將程序定義為:“……計(jì)算機(jī)可以理解并執(zhí)行的一系列指令……” 維基百科 上也有一條不錯(cuò)的關(guān)于計(jì)算機(jī)程序的條目。

總結(jié)下,程序由一條或多條指令組成,目的是完成一個(gè)具體的相關(guān)任務(wù)。對(duì)于系統(tǒng)管理員而言,一段程序通常由一系列的 shell 命令構(gòu)成。Linux 下所有的 shell (至少我所熟知的)都有基本的編程功能,Bash 作為大多數(shù) linux 發(fā)行版的默認(rèn) shell,也不例外。

本系列用 Bash 舉例(因?yàn)樗鼰o處不在),假如你使用一個(gè)不同的 shell 也沒關(guān)系,盡管結(jié)構(gòu)和語法有所不同,但編程思想是相通的。有些 shell 支持某種特性而其他 shell 則不支持,但它們都提供編程功能。Shell 程序可以被存在一個(gè)文件中被反復(fù)使用,或者在需要的時(shí)候才創(chuàng)建它們。

簡單 CLI 程序

最簡單的命令行程序只有一或兩條語句,它們可能相關(guān),也可能無關(guān),在按回車鍵之前被輸入到命令行。程序中的第二條語句(如果有的話)可能取決于第一條語句的操作,但也不是必須的。

這里需要特別講解一個(gè)標(biāo)點(diǎn)符號(hào)。當(dāng)你在命令行輸入一條命令,按下回車鍵的時(shí)候,其實(shí)在命令的末尾有一個(gè)隱含的分號(hào)(;)。當(dāng)一段 CLI shell 程序在命令行中被串起來作為單行指令使用時(shí),必須使用分號(hào)來終結(jié)每個(gè)語句并將其與下一條語句分開。但 CLI shell 程序中的最后一條語句可以使用顯式或隱式的分號(hào)。

一些基本語法

下面的例子會(huì)闡明這一語法規(guī)則。這段程序由單條命令組成,還有一個(gè)顯式的終止符:

看起來不像一個(gè)程序,但它確是我學(xué)習(xí)每個(gè)新編程語言時(shí)寫下的第一個(gè)程序。不同語言可能語法不同,但輸出結(jié)果是一樣的。

讓我們擴(kuò)展一下這段微不足道卻又無所不在的代碼。你的結(jié)果可能與我的有所不同,因?yàn)槲业募夷夸浻悬c(diǎn)亂,而你可能是在 GUI 桌面中第一次登錄賬號(hào)。

現(xiàn)在是不是更明顯了。結(jié)果是相關(guān)的,但是兩條語句彼此獨(dú)立。你可能注意到我喜歡在分號(hào)前后多輸入一個(gè)空格,這樣會(huì)讓代碼的可讀性更好。讓我們?cè)龠\(yùn)行一遍這段程序,這次不要帶結(jié)尾的分號(hào):

輸出結(jié)果沒有區(qū)別。

關(guān)于變量

像所有其他編程語言一樣,Bash 支持變量。變量是個(gè)象征性的名字,它指向內(nèi)存中的某個(gè)位置,那里存著對(duì)應(yīng)的值。變量的值是可以改變的,所以它叫“變~量”。

Bash 不像 C 之類的語言,需要強(qiáng)制指定變量類型,比如:整型、浮點(diǎn)型或字符型。在 Bash 中,所有變量都是字符串。整數(shù)型的變量可以被用于整數(shù)運(yùn)算,這是 Bash 唯一能夠處理的數(shù)學(xué)類型。更復(fù)雜的運(yùn)算則需要借助 bc 這樣的命令,可以被用在命令行編程或者腳本中。

變量的值是被預(yù)先分配好的,這些值可以用在命令行編程或者腳本中。可以通過變量名字給其賦值,但是不能使用 $ 符開頭。比如,VAR=10 這樣會(huì)把 VAR 的值設(shè)為 10。要打印變量的值,你可以使用語句 echo $VAR。變量名必須以文本(即非數(shù)字)開始。

Bash 會(huì)保存已經(jīng)定義好的變量,直到它們被取消掉。

下面這個(gè)例子,在變量被賦值前,它的值是空(null)。然后給它賦值并打印出來,檢驗(yàn)一下。你可以在同一行 CLI 程序里完成它:

注意:變量賦值的語法非常嚴(yán)格,等號(hào)(=)兩邊不能有空格。

那個(gè)空行表明了 MyVar 的初始值為空。變量的賦值和改值方法都一樣,這個(gè)例子展示了原始值和新的值。

正如之前說的,Bash 支持整數(shù)運(yùn)算,當(dāng)你想計(jì)算一個(gè)數(shù)組中的某個(gè)元素的位置,或者做些簡單的算術(shù)運(yùn)算,這還是挺有幫助的。然而,這種方法并不適合科學(xué)計(jì)算,或是某些需要小數(shù)運(yùn)算的場景,比如財(cái)務(wù)統(tǒng)計(jì)。這些場景有其它更好的工具可以應(yīng)對(duì)。

下面是個(gè)簡單的算術(shù)題:

好像沒啥問題,但如果運(yùn)算結(jié)果是浮點(diǎn)數(shù)會(huì)發(fā)生什么呢?

結(jié)果會(huì)被取整。請(qǐng)注意運(yùn)算被包含在 echo 語句之中,其實(shí)計(jì)算在 echo 命令結(jié)束前就已經(jīng)完成了,原因是 Bash 的內(nèi)部優(yōu)先級(jí)。想要了解詳情的話,可以在 Bash 的 man 頁面中搜索 “precedence”。

控制運(yùn)算符

Shell 的控制運(yùn)算符是一種語法運(yùn)算符,可以輕松地創(chuàng)建一些有趣的命令行程序。在命令行上按順序?qū)讉€(gè)命令串在一起,就變成了最簡單的 CLI 程序:

只要不出錯(cuò),這些命令都能順利執(zhí)行。但假如出錯(cuò)了怎么辦?你可以預(yù)設(shè)好應(yīng)對(duì)出錯(cuò)的辦法,這就要用到 Bash 內(nèi)置的控制運(yùn)算符, && 和 ||。這兩種運(yùn)算符提供了流程控制功能,使你能改變代碼執(zhí)行的順序。分號(hào)也可以被看做是一種 Bash 運(yùn)算符,預(yù)示著新一行的開始。

&& 運(yùn)算符提供了如下簡單邏輯,“如果 command1 執(zhí)行成功,那么接著執(zhí)行 command2。如果 command1 失敗,就跳過 command2。”語法如下:

現(xiàn)在,讓我們用命令來創(chuàng)建一個(gè)新的目錄,如果成功的話,就把它切換為當(dāng)前目錄。確保你的家目錄(~)是當(dāng)前目錄,先嘗試在 /root 目錄下創(chuàng)建,你應(yīng)該沒有權(quán)限:

上面的報(bào)錯(cuò)信息是由 mkdir 命令拋出的,因?yàn)閯?chuàng)建目錄失敗了。&& 運(yùn)算符收到了非零的返回碼,所以 cd 命令就被跳過,前者阻止后者繼續(xù)運(yùn)行,因?yàn)閯?chuàng)建目錄失敗了。這種控制流程可以阻止后面的錯(cuò)誤累積,避免引發(fā)更嚴(yán)重的問題。是時(shí)候講點(diǎn)更復(fù)雜的邏輯了。

當(dāng)一段程序的返回碼大于零時(shí),使用 || 運(yùn)算符可以讓你在后面接著執(zhí)行另一段程序。簡單語法如下:

解讀一下,“假如 command1 失敗,執(zhí)行 command2”。隱藏的邏輯是,如果 command1 成功,跳過 command2。下面實(shí)踐一下,仍然是創(chuàng)建新目錄:

正如預(yù)期,因?yàn)槟夸洘o法創(chuàng)建,第一條命令失敗了,于是第二條命令被執(zhí)行。

把 && 和 || 兩種運(yùn)算符結(jié)合起來才能發(fā)揮它們的最大功效。請(qǐng)看下面例子中的流程控制方法:

語法解釋:“假如 command1 退出時(shí)返回碼為零,就執(zhí)行 command2,否則執(zhí)行 command3。”用具體代碼試試:

現(xiàn)在我們?cè)僭囈淮危媚愕募夷夸浱鎿Q /root 目錄,你將會(huì)有權(quán)限創(chuàng)建這個(gè)目錄了:

像 command1 && command2 這樣的控制語句能夠運(yùn)行的原因是,每條命令執(zhí)行完畢時(shí)都會(huì)給 shell 發(fā)送一個(gè)返回碼,用來表示它執(zhí)行成功與否。默認(rèn)情況下,返回碼為 0 表示成功,其他任何正值表示失敗。一些系統(tǒng)管理員使用的工具用值為 1 的返回碼來表示失敗,但其他很多程序使用別的數(shù)字來表示失敗。

Bash 的內(nèi)置變量 $? 可以顯示上一條命令的返回碼,可以在腳本或者命令行中非常方便地檢查它。要查看返回碼,讓我們從運(yùn)行一條簡單的命令開始,返回碼的結(jié)果總是上一條命令給出的。

在這個(gè)例子中,返回碼為零,意味著命令執(zhí)行成功了。現(xiàn)在對(duì) root 的家目錄測試一下,你應(yīng)該沒有權(quán)限:

本例中返回碼是 2,表明非 root 用戶沒有權(quán)限進(jìn)入這個(gè)目錄。你可以利用這些返回碼,用控制運(yùn)算符來改變程序執(zhí)行的順序。

總結(jié)

本文將 Bash 看作一門編程語言,并從這個(gè)視角介紹了它的簡單語法和基礎(chǔ)工具。我們學(xué)習(xí)了如何將數(shù)據(jù)輸出到 STDOUT,怎樣使用變量和控制運(yùn)算符。在本系列的下一篇文章中,將會(huì)重點(diǎn)介紹能夠控制指令執(zhí)行流程的邏輯運(yùn)算符。


via: https://opensource.com/article/19/10/programming-bash-part-1

作者: David Both 選題: lujun9972 譯者: jdh8383 校對(duì): wxy

本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽(yù)推出

分享到:
標(biāo)簽:編程 Bash
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定