久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Bash中的邏輯和(&)該如何理解

155次閱讀
沒有評論

共計 3275 個字符,預計需要花費 9 分鐘才能閱讀完成。

本篇文章為大家展示了 Bash 中的邏輯和()該如何理解,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

在 Bash 中,你可以使用 作為 AND(邏輯和)操作符。

有人可能會認為兩篇文章中的 意思差不多,但實際上并不是。雖然 第一篇文章討論了如何在命令末尾使用 來將命令轉到后臺運行,在之后剖析了流程管理,第二篇文章將   看作引用文件描述符的方法,這些文章讓我們知道了,與 和 結合使用后,你可以將輸入或輸出引導到別的地方。

但我們還沒接觸過作為 AND 操作符使用的。所以,讓我們來看看。

是一個按位運算符

如果你十分熟悉二進制數操作,你肯定聽說過 AND 和 OR。這些是按位操作,對二進制數的各個位進行操作。在 Bash 中,使用 作為 AND 運算符,使用 | 作為 OR 運算符:

AND:

0   0 = 00   1 = 01   0 = 01   1 = 1

OR:

0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1

你可以通過對任何兩個數字進行 AND 運算并使用 echo 輸出結果:

$ echo $(( 2   3 )) # 00000010 AND 00000011 = 000000102$ echo $(( 120   97 )) # 01111000 AND 01100001 = 0110000096

OR(|)也是如此:

$ echo $(( 2 | 3 )) # 00000010 OR 00000011 = 000000113$ echo $(( 120 | 97 )) # 01111000 OR 01100001 = 01111001121

說明:

鴻蒙官方戰略合作共建——HarmonyOS 技術社區

使用 ((…)) 告訴 Bash 雙括號之間的內容是某種算術或邏輯運算。((2 + 2))、((5 % 2))(% 是求模運算符)和 (((5 % 2) + 1))(等于 3)都可以工作。

像變量一樣,使用 $ 提取值,以便你可以使用它。

空格并沒有影響:((2+3)) 等價于 ((2+3)) 和 ((2 + 3))。

Bash 只能對整數進行操作。試試這樣做:((5 / 2)),你會得到 2;或者這樣 ((2.5 7)),但會得到一個錯誤。然后,在按位操作中使用除了整數之外的任何東西(這就是我們現在所討論的)通常是你不應該做的事情。

提示:如果你想看看十進制數字在二進制下會是什么樣子,你可以使用 bc,這是一個大多數 Linux 發行版都預裝了的命令行計算器。比如:

bc    obase=2; 97

這個操作將會把 97 轉換成十二進制(obase 中的 o 代表“output”,也即,“輸出”)。

bc    ibase=2; 11001011

這個操作將會把 11001011 轉換成十進制(ibase 中的 i 代表“input”,也即,“輸入”)。

是一個邏輯運算符

雖然它使用與其按位表達相同的邏輯原理,但 Bash 的 運算符只能呈現兩個結果:1(“真值”)和 0(“假值”)。對于 Bash 來說,任何不是 0 的數字都是“真值”,任何等于 0 的數字都是“假值”。什么也是“假值”同時也不是數字呢:

$ echo $(( 4   5 )) #  兩個非零數字,兩個為  true = true1$ echo $(( 0   5 )) #  有一個為零,一個為  false = false0$ echo $(( b   5 )) #  其中一個不是數字,一個為  false = false0

與 類似,OR 對應著 ||,用法正如你想的那樣。

以上這些都很簡單 hellip; hellip; 直到它用在命令的退出狀態時。

是命令退出狀態的邏輯運算符

正如我們在之前的文章中看到的,當命令運行時,它會輸出錯誤消息。更重要的是,對于今天的討論,它在結束時也會輸出一個數字。此數字稱為“返回碼”,如果為 0,則表示該命令在執行期間未遇到任何問題。如果是任何其他數字,即使命令完成,也意味著某些地方出錯了。

所以 0 意味著是好的,任何其他數字都說明有問題發生,并且,在返回碼的上下文中,0 意味著“真”,其他任何數字都意味著“假”。對!這 與你所熟知的邏輯操作完全相反,但是你能用這個做什么?不同的背景,不同的規則。這種用處很快就會顯現出來。

讓我們繼續!

返回碼 臨時 儲存在 特殊變量 ? 中 mdash; mdash; 是的,我知道:這又是一個令人迷惑的選擇。但不管怎樣,別忘了我們在討論變量的文章中說過,那時我們說你要用 $ 符號來讀取變量中的值,在這里也一樣。所以,如果你想知道一個命令是否順利運行,你需要在命令結束后,在運行別的命令之前馬上用 $? 來讀取 ? 變量的值。

試試下面的命令:

$ find /etc -iname  *.service find:  /etc/audisp/plugins.d : Permission denied/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service[......]

正如你在上一篇文章中看到的一樣,普通用戶權限在 /etc 下運行 find 通常將拋出錯誤,因為它試圖讀取你沒有權限訪問的子目錄。

所以,如果你在執行 find 后立馬執行 hellip; hellip;

echo $?

hellip; hellip;,它將打印 1,表明存在錯誤。

(注意:當你在一行中運行兩遍 echo $?,你將得到一個 0。這是因為 $? 將包含第一個 echo $? 的返回碼,而這條命令按理說一定會執行成功。所以學習如何使用 $? 的第一課就是:單獨執行 $? 或者將它保存在別的安全的地方 mdash; mdash; 比如保存在一個變量里,不然你會很快丟失它。)

一個直接使用 ? 變量的用法是將它并入一串鏈式命令列表,這樣 Bash 運行這串命令時若有任何操作失敗,后面命令將終止。例如,你可能熟悉構建和編譯應用程序源代碼的過程。你可以像這樣手動一個接一個地運行它們:

$ configure...$ make...$ make install...

你也可以把這三行合并成一行 hellip; hellip;

$ configure; make; make install

hellip; hellip; 但你要希望上天保佑。

為什么這樣說呢?因為你這樣做是有缺點的,比方說 configure 執行失敗了,Bash 將仍會嘗試執行 make 和 sudo make install mdash; mdash; 就算沒東西可 make,實際上,是沒東西會安裝。

聰明一點的做法是:

$ configure   make   make install

這將從每個命令中獲取退出碼,并將其用作鏈式 操作的操作數。

但是,沒什么好抱怨的,Bash 知道如果 configure 返回非零結果,整個過程都會失敗。如果發生這種情況,不必運行 make 來檢查它的退出代碼,因為無論如何都會失敗的。因此,它放棄運行 make,只是將非零結果傳遞給下一步操作。并且,由于 configure make 傳遞了錯誤,Bash 也不必運行 make install。這意味著,在一長串命令中,你可以使用 連接它們,并且一旦失敗,你可以節省時間,因為其他命令會立即被取消運行。

你可以類似地使用 ||,OR 邏輯操作符,這樣就算只有一部分命令成功執行,Bash 也能運行接下來鏈接在一起的命令。

鑒于所有這些(以及我們之前介紹過的內容),你現在應該更清楚地了解我們在 這篇文章開頭 出現的命令行:

mkdir test_dir 2 /dev/null || touch backup/dir/images.txt   find . -iname  *jpg    backup/dir/images.txt 

因此,假設你從具有讀寫權限的目錄運行上述內容,它做了什么以及如何做到這一點?它如何避免不合時宜且可能導致執行中斷的錯誤?

上述內容就是 Bash 中的邏輯和()該如何理解,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3275字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 长乐市| 连州市| 康平县| 沭阳县| 鲜城| 凤阳县| 英山县| 和顺县| 五家渠市| 涞水县| 合水县| 莱州市| 平遥县| 诸城市| 波密县| 开封市| 马公市| 团风县| 石泉县| 松滋市| 油尖旺区| 麻城市| 湘潭市| 南雄市| 资兴市| 大关县| 通城县| 临沂市| 赤壁市| 蒲江县| 德阳市| 永年县| 衡阳市| 汤阴县| 安龙县| 江安县| 巴南区| 萍乡市| 柳河县| 体育| 龙陵县|