溫馨提示×

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

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

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

發(fā)布時(shí)間:2022-01-07 15:50:03 來源:億速云 閱讀:120 作者:柒染 欄目:系統(tǒng)運(yùn)維

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

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

有人可能會(huì)認(rèn)為兩篇文章中的 & 意思差不多,但實(shí)際上并不是。雖然 第一篇文章討論了如何在命令末尾使用 & 來將命令轉(zhuǎn)到后臺(tái)運(yùn)行,在之后剖析了流程管理,第二篇文章將  & 看作引用文件描述符的方法,這些文章讓我們知道了,與 <> 結(jié)合使用后,你可以將輸入或輸出引導(dǎo)到別的地方。

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

& 是一個(gè)按位運(yùn)算符

如果你十分熟悉二進(jìn)制數(shù)操作,你肯定聽說過 AND 和 OR 。這些是按位操作,對(duì)二進(jìn)制數(shù)的各個(gè)位進(jìn)行操作。在 Bash 中,使用 & 作為 AND 運(yùn)算符,使用 | 作為 OR 運(yùn)算符:

AND

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

OR

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

你可以通過對(duì)任何兩個(gè)數(shù)字進(jìn)行 AND 運(yùn)算并使用 echo 輸出結(jié)果:

$ 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

說明:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 使用 (( ... )) 告訴 Bash 雙括號(hào)之間的內(nèi)容是某種算術(shù)或邏輯運(yùn)算。(( 2 + 2 ))(( 5 % 2 ))% 是求模運(yùn)算符)和 ((( 5 % 2 ) + 1))(等于 3)都可以工作。

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

  4. 空格并沒有影響:((2+3)) 等價(jià)于 (( 2+3 ))(( 2 + 3 ))。

  5. Bash 只能對(duì)整數(shù)進(jìn)行操作。試試這樣做: (( 5 / 2 )) ,你會(huì)得到 2;或者這樣 (( 2.5 & 7 )) ,但會(huì)得到一個(gè)錯(cuò)誤。然后,在按位操作中使用除了整數(shù)之外的任何東西(這就是我們現(xiàn)在所討論的)通常是你不應(yīng)該做的事情。

提示: 如果你想看看十進(jìn)制數(shù)字在二進(jìn)制下會(huì)是什么樣子,你可以使用 bc ,這是一個(gè)大多數(shù) Linux 發(fā)行版都預(yù)裝了的命令行計(jì)算器。比如:

bc <<< "obase=2; 97"

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

bc <<< "ibase=2; 11001011"

這個(gè)操作將會(huì)把 11001011 轉(zhuǎn)換成十進(jìn)制(ibase 中的 i 代表 “input”,也即,“輸入”)。

&& 是一個(gè)邏輯運(yùn)算符

雖然它使用與其按位表達(dá)相同的邏輯原理,但 Bash 的 && 運(yùn)算符只能呈現(xiàn)兩個(gè)結(jié)果:1(“真值”)和0(“假值”)。對(duì)于 Bash 來說,任何不是 0 的數(shù)字都是 “真值”,任何等于 0 的數(shù)字都是 “假值”。什么也是 “假值”同時(shí)也不是數(shù)字呢:

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

&& 類似, OR 對(duì)應(yīng)著 || ,用法正如你想的那樣。

以上這些都很簡(jiǎn)單&hellip;&hellip;直到它用在命令的退出狀態(tài)時(shí)。

&& 是命令退出狀態(tài)的邏輯運(yùn)算符

正如我們?cè)谥暗奈恼轮锌吹降模?dāng)命令運(yùn)行時(shí),它會(huì)輸出錯(cuò)誤消息。更重要的是,對(duì)于今天的討論,它在結(jié)束時(shí)也會(huì)輸出一個(gè)數(shù)字。此數(shù)字稱為“返回碼”,如果為 0,則表示該命令在執(zhí)行期間未遇到任何問題。如果是任何其他數(shù)字,即使命令完成,也意味著某些地方出錯(cuò)了。

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

讓我們繼續(xù)!

返回碼 臨時(shí) 儲(chǔ)存在 特殊變量 ? 中 &mdash;&mdash; 是的,我知道:這又是一個(gè)令人迷惑的選擇。但不管怎樣,別忘了我們?cè)谟懻撟兞康奈恼轮姓f過,那時(shí)我們說你要用 $ 符號(hào)來讀取變量中的值,在這里也一樣。所以,如果你想知道一個(gè)命令是否順利運(yùn)行,你需要在命令結(jié)束后,在運(yùn)行別的命令之前馬上用 $? 來讀取 ? 變量的值。

試試下面的命令:

$ 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[......]

正如你在上一篇文章中看到的一樣,普通用戶權(quán)限在 /etc 下運(yùn)行 find 通常將拋出錯(cuò)誤,因?yàn)樗噲D讀取你沒有權(quán)限訪問的子目錄。

所以,如果你在執(zhí)行 find 后立馬執(zhí)行&hellip;&hellip;

echo $?

&hellip;&hellip;,它將打印 1,表明存在錯(cuò)誤。

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

一個(gè)直接使用 ? 變量的用法是將它并入一串鏈?zhǔn)矫盍斜?,這樣 Bash 運(yùn)行這串命令時(shí)若有任何操作失敗,后面命令將終止。例如,你可能熟悉構(gòu)建和編譯應(yīng)用程序源代碼的過程。你可以像這樣手動(dòng)一個(gè)接一個(gè)地運(yùn)行它們:

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

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

$ configure; make; make install

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

為什么這樣說呢?因?yàn)槟氵@樣做是有缺點(diǎn)的,比方說 configure 執(zhí)行失敗了, Bash 將仍會(huì)嘗試執(zhí)行 makesudo make install&mdash;&mdash;就算沒東西可 make ,實(shí)際上,是沒東西會(huì)安裝。

聰明一點(diǎn)的做法是:

$ configure && make && make install

這將從每個(gè)命令中獲取退出碼,并將其用作鏈?zhǔn)?&& 操作的操作數(shù)。

但是,沒什么好抱怨的,Bash 知道如果 configure 返回非零結(jié)果,整個(gè)過程都會(huì)失敗。如果發(fā)生這種情況,不必運(yùn)行 make 來檢查它的退出代碼,因?yàn)闊o論如何都會(huì)失敗的。因此,它放棄運(yùn)行 make,只是將非零結(jié)果傳遞給下一步操作。并且,由于 configure && make 傳遞了錯(cuò)誤,Bash 也不必運(yùn)行make install。這意味著,在一長(zhǎng)串命令中,你可以使用 && 連接它們,并且一旦失敗,你可以節(jié)省時(shí)間,因?yàn)槠渌顣?huì)立即被取消運(yùn)行。

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

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

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

因此,假設(shè)你從具有讀寫權(quán)限的目錄運(yùn)行上述內(nèi)容,它做了什么以及如何做到這一點(diǎn)?它如何避免不合時(shí)宜且可能導(dǎo)致執(zhí)行中斷的錯(cuò)誤?

上述內(nèi)容就是Bash中的邏輯和(&)該如何理解,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI