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

ただし、上記の例では、角括弧はサブシェルを生成します。うまくいきますが、シェル中​​括弧のサブシェルを使用しないことをお勧めします。

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

または、グループ化には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

関連情報