Bash

bash 條件的分組

  • September 19, 2022

我有以下bash需要更改的條件測試。

if (( exec_rc == 1 )) && [ -z "$keymap_actm" ] && [ -n "$modmap_actm" ]; then

(( exec_rc == 1 ))必須始終為真。

但是,如果兩者中的任何一個[ -z "$keymap_actm" ][ -n "$modmap_actm" ]為真,我想執行條件的主體。

什麼是實現我想要的可讀方式?

分組是用括號完成的,與算術類似。

你可以這樣做(不推薦):

if (( exec_rc == 1 )) && ( [ -z "$keymap_actm" ] || [ -n "$modmap_actm" ] ); then

但是,在上面的範例中,括號創建了一個子外殼。它可以工作,但最好避免使用殼大括號的子殼:

if (( exec_rc == 1 )) && { [ -z "$keymap_actm" ] || [ -n "$modmap_actm" ] ; }; then

或者您可以使用 a[[分組(不要使用 a [):

if (( exec_rc == 1 )) && [[ -z "$keymap_actm" || -n "$modmap_actm" ]]; then

或者(推薦的語法):

if [[ exec_rc -eq 1 && ( -z "$keymap_actm" || -n "$modmap_actm" ) ]]; then

請注意,該[[語法適用於所有版本的 bash 和大部分 Ksh 或 zsh,但不適用於 Bourne sh

[[ … ]]通篇使用(條件表達式構造)。請注意,在條件表達式中,整數之間的相等是拼寫的-eq==將進行文本模式匹配,這可能會或可能不會在您的特定腳本中起作用,具體取決於exec_rc可以採用的值)。

if [[ $exec_rc -eq 1 && (-z $keymap_actm || -n $modmap_actm) ]]; then …

請注意,[[ … ]]分隔符周圍需要空格(除了命令分隔標點符號旁邊,例如;),但條件表達式內的括號和運算符周圍不需要空格。

引用自:https://unix.stackexchange.com/questions/717758