本篇文章為大家展示了Bash中的邏輯和(&)該如何理解,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
目前創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、霸州網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
在 Bash 中,你可以使用 & 作為 AND(邏輯和)操作符。
有人可能會認(rèn)為兩篇文章中的 &
意思差不多,但實際上并不是。雖然 第一篇文章討論了如何在命令末尾使用 & 來將命令轉(zhuǎn)到后臺運行,在之后剖析了流程管理,第二篇文章將 & 看作引用文件描述符的方法,這些文章讓我們知道了,與 <
和 >
結(jié)合使用后,你可以將輸入或輸出引導(dǎo)到別的地方。
但我們還沒接觸過作為 AND 操作符使用的 &
。所以,讓我們來看看。
如果你十分熟悉二進(jìn)制數(shù)操作,你肯定聽說過 AND 和 OR 。這些是按位操作,對二進(jìn)制數(shù)的各個位進(jìn)行操作。在 Bash 中,使用 &
作為 AND 運算符,使用 |
作為 OR 運算符:
AND:
0 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1
OR:
0 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1
你可以通過對任何兩個數(shù)字進(jìn)行 AND 運算并使用 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
說明:
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
使用 (( ... ))
告訴 Bash 雙括號之間的內(nèi)容是某種算術(shù)或邏輯運算。(( 2 + 2 ))
、 (( 5 % 2 ))
(%
是求模運算符)和 ((( 5 % 2 ) + 1))
(等于 3)都可以工作。
像變量一樣,使用 $
提取值,以便你可以使用它。
空格并沒有影響:((2+3))
等價于 (( 2+3 ))
和 (( 2 + 3 ))
。
Bash 只能對整數(shù)進(jìn)行操作。試試這樣做: (( 5 / 2 ))
,你會得到 2
;或者這樣 (( 2.5 & 7 ))
,但會得到一個錯誤。然后,在按位操作中使用除了整數(shù)之外的任何東西(這就是我們現(xiàn)在所討論的)通常是你不應(yīng)該做的事情。
提示:如果你想看看十進(jìn)制數(shù)字在二進(jìn)制下會是什么樣子,你可以使用 bc
,這是一個大多數(shù) Linux 發(fā)行版都預(yù)裝了的命令行計算器。比如:
bc <<< "obase=2; 97"
這個操作將會把 97
轉(zhuǎn)換成十二進(jìn)制(obase
中的 o
代表 “output” ,也即,“輸出”)。
bc <<< "ibase=2; 11001011"
這個操作將會把 11001011
轉(zhuǎn)換成十進(jìn)制(ibase
中的 i
代表 “input”,也即,“輸入”)。
雖然它使用與其按位表達(dá)相同的邏輯原理,但 Bash 的 &&
運算符只能呈現(xiàn)兩個結(jié)果:1
(“真值”)和0
(“假值”)。對于 Bash 來說,任何不是 0
的數(shù)字都是 “真值”,任何等于 0
的數(shù)字都是 “假值”。什么也是 “假值”同時也不是數(shù)字呢:
$ echo $(( 4 && 5 )) # 兩個非零數(shù)字,兩個為 true = true1$ echo $(( 0 && 5 )) # 有一個為零,一個為 false = false0$ echo $(( b && 5 )) # 其中一個不是數(shù)字,一個為 false = false0
與 &&
類似, OR 對應(yīng)著 ||
,用法正如你想的那樣。
以上這些都很簡單……直到它用在命令的退出狀態(tài)時。
正如我們在之前的文章中看到的,當(dāng)命令運行時,它會輸出錯誤消息。更重要的是,對于今天的討論,它在結(jié)束時也會輸出一個數(shù)字。此數(shù)字稱為“返回碼”,如果為 0,則表示該命令在執(zhí)行期間未遇到任何問題。如果是任何其他數(shù)字,即使命令完成,也意味著某些地方出錯了。
所以 0 意味著是好的,任何其他數(shù)字都說明有問題發(fā)生,并且,在返回碼的上下文中,0 意味著“真”,其他任何數(shù)字都意味著“假”。對!這 與你所熟知的邏輯操作完全相反,但是你能用這個做什么? 不同的背景,不同的規(guī)則。這種用處很快就會顯現(xiàn)出來。
讓我們繼續(xù)!
返回碼 臨時 儲存在 特殊變量 ?
中 —— 是的,我知道:這又是一個令人迷惑的選擇。但不管怎樣,別忘了我們在討論變量的文章中說過,那時我們說你要用 $
符號來讀取變量中的值,在這里也一樣。所以,如果你想知道一個命令是否順利運行,你需要在命令結(jié)束后,在運行別的命令之前馬上用 $?
來讀取 ?
變量的值。
試試下面的命令:
$ 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
下運行 find
通常將拋出錯誤,因為它試圖讀取你沒有權(quán)限訪問的子目錄。
所以,如果你在執(zhí)行 find
后立馬執(zhí)行……
echo $?
……,它將打印 1
,表明存在錯誤。
(注意:當(dāng)你在一行中運行兩遍 echo $?
,你將得到一個 0
。這是因為 $?
將包含第一個 echo $?
的返回碼,而這條命令按理說一定會執(zhí)行成功。所以學(xué)習(xí)如何使用 $?
的第一課就是: 單獨執(zhí)行 $?
或者將它保存在別的安全的地方 —— 比如保存在一個變量里,不然你會很快丟失它。)
一個直接使用 ?
變量的用法是將它并入一串鏈?zhǔn)矫盍斜?,這樣 Bash 運行這串命令時若有任何操作失敗,后面命令將終止。例如,你可能熟悉構(gòu)建和編譯應(yīng)用程序源代碼的過程。你可以像這樣手動一個接一個地運行它們:
$ configure...$ make...$ make install...
你也可以把這三行合并成一行……
$ configure; make; make install
…… 但你要希望上天保佑。
為什么這樣說呢?因為你這樣做是有缺點的,比方說 configure
執(zhí)行失敗了, Bash 將仍會嘗試執(zhí)行 make
和 sudo make install
——就算沒東西可 make
,實際上,是沒東西會安裝。
聰明一點的做法是:
$ configure && make && make install
這將從每個命令中獲取退出碼,并將其用作鏈?zhǔn)?&&
操作的操作數(shù)。
但是,沒什么好抱怨的,Bash 知道如果 configure
返回非零結(jié)果,整個過程都會失敗。如果發(fā)生這種情況,不必運行 make
來檢查它的退出代碼,因為無論如何都會失敗的。因此,它放棄運行 make
,只是將非零結(jié)果傳遞給下一步操作。并且,由于 configure && make
傳遞了錯誤,Bash 也不必運行make install
。這意味著,在一長串命令中,你可以使用 &&
連接它們,并且一旦失敗,你可以節(jié)省時間,因為其他命令會立即被取消運行。
你可以類似地使用 ||
,OR 邏輯操作符,這樣就算只有一部分命令成功執(zhí)行,Bash 也能運行接下來鏈接在一起的命令。
鑒于所有這些(以及我們之前介紹過的內(nèi)容),你現(xiàn)在應(yīng)該更清楚地了解我們在 這篇文章開頭 出現(xiàn)的命令行:
mkdir test_dir 2>/dev/null || touch backup/dir/images.txt && find . -iname "*jpg" > backup/dir/images.txt &
因此,假設(shè)你從具有讀寫權(quán)限的目錄運行上述內(nèi)容,它做了什么以及如何做到這一點?它如何避免不合時宜且可能導(dǎo)致執(zhí)行中斷的錯誤?
上述內(nèi)容就是Bash中的邏輯和(&)該如何理解,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。