bash 条件分组

bash 条件分组

我有以下bash条件测试需要更改。

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

(( exec_rc == 1 ))必须始终为真。

但如果两者之一[ -z "$keymap_actm" ][ -n "$modmap_actm" ]为真,我想执行条件的主体。

什么是实现我想要的目标的可读方式?

答案1

全程使用[[ … ]](a条件表达式构造)。请注意,在条件表达式内部,整数之间的相等是拼写的-eq(将进行文本模式匹配,这可能会也可能不会在您的特定脚本中起作用,具体取决于可以采用的==值)。exec_rc

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

请注意,分隔符周围需要空格[[ … ]](命令分隔标点符号旁边除外,例如;),但条件表达式内的括号和运算符周围不需要空格。

答案2

分组是通过括号完成的,其方式与算术类似。

你可以这样做(不推荐):

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

但是,在上面的示例中,括号正在创建一个子 shell。它可以工作,但最好避免使用外壳大括号的子外壳:

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

相关内容