zsh ifステートメントで変数を区切るには、括弧を使用してください。

zsh ifステートメントで変数を区切るには、括弧を使用してください。

zsh 完成関数では、次の if 文が発生します。

if _cache_invalid my_data || ( [[ ${+_my_array_var} -eq 0 ]] && ! _retrieve_cache my_data ) ; then ...

アイデアは、キャッシュが無効な場合はifブロックを入力することです。それ以外の場合は設定されていることを確認し、そうで_my_array_varない場合はキャッシュから検索してみてください。設定せずにキャッシュ検索に失敗すると、_my_array_varifブロックも入力されます。デバッグに関する限り、if文のロジックは問題ありませんが、変数がキャッシュから_my_array_var正常に取得されると、if文の後半は変数を埋めません。

短いテストでは、かっこを非難したことがわかりました

echo ${+_my_array_var}
if [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data; then echo "entered" ; fi
echo ${+_my_array_var}

これは0当時の状況を反映しています1(つまり_my_array_var、設定されていない場合はキャッシュ検索が機能してから設定さ_my_array_varれます。)

echo ${+_my_array_var}
if ( [[ ${+_my_array_var} -eq 0 ]] && !_retrieve_cache my_data ); then echo "entered" ; fi
echo ${+_my_array_var}

これは02回エコーされます。つまり、ifブロックはまだ入力されていませんが、人口は_my_array_varifテストを「残していません」ということです。

したがって、元のコードでは括弧を削除する必要があるようですが、式の階層や段落の動作を変更せずにこれを実行したいと思います。

かっこを使用せずに関連性を||設定する方法は?&&

ベストアンサー1

すべてのBourne様シェルでは、like内の括弧はzshサブシェルの実行を表します。

コマンドをグループ化するには、次のようにします。{ ...; } コマンドグループ代わりに:

if
  _cache_invalid my_data || {
    (( $+_my_array_var == 0 )) &&
      ! _retrieve_cache my_data
  }
then ...

または:

if
  _cache_invalid my_data || ! {
    (($+_my_array_var )) || _retrieve_cache my_data
  }
then ...

バラよりinfo zsh subshell詳細:

( LIST )
サブシェルでLISTを実行します。 LIST が実行されると、組み込みトラップによって設定されたトラップがデフォルト値にリセットされます。

{ LIST }
実行リスト。

おすすめ記事