与えられた文字列が配列の項目と一致するかどうかを確認するには?

与えられた文字列が配列の項目と一致するかどうかを確認するには?

ディレクトリのリストがあります。それらの中には名前にパターンがあります。私はこれらのパターンの配列を作成しました。

次に、結果を繰り返しfindて各結果を各パターンと比較し、一致する場合は項目をスキップする必要があります。

これは私のコードです。

declare -a patterns=("*Api" "*Panel" "Common" "Site*" ".*")
while read folder; do
    if [[ $folder == "" ]]; then continue; fi
    for pattern in "${patterns[@]}"
    do
        echo  "Checking $folder $pattern ..."
        if [[ $folder == $pattern ]]; then
            echo "Matched $folder $pattern"
        fi
    done
done <<< "$({ find /some-path -mindepth 1 -maxdepth 1 -type d | cut -d'/' -f3 | sort })"

しかし、これはうまくいきません。たとえば、AdminApiディレクトリはと一致する必要があります*Api

静的に実行すると動作if [[ AdminApi == *Api ]]; then echo 'yes'; fiするようになります。

しかし、配列で繰り返すと機能しません。

ここで問題は何ですか?

ベストアンサー1

zsh代わりに使用すると、bashこれは簡単になり、より安定しています。

typeset -A patterns=(
  '*Api'   .
  '*Panel' .
  'Common' .
  'Site*'  .
  '.*'     .
)
for dir in /some/path/*(ND/:t); do
  matched_patterns=( ${(k)patterns[(K)$dir]} )
  if (( $#matched_patterns )) print -r -- $dir matched ${(j[, ])matched_patterns}
done

たとえば、次のようになります。

.Panel matched .*, *Panel
SiteApi matched Site*, *Api

これは以下を使用します。K 下付き文字記号連想配列の場合、拡張時にパターンが下付き文字に一致する要素としてキーを返します。そしてk パラメータ拡張フラグ、これは返された値ではなくキーです。これを削除し、連想配列を次のように定義できます。

typeset -A patterns=(
  '*Api'   'API pattern'
  '*Panel' 'panel pattern'
  Common   Common
  'Site*'  'site pattern'
  '.*'     'hidden file'
)

取得するには:

.Panel matched hidden file, panel pattern
SiteApi matched site pattern, API pattern

例えば。

目的がこれらのパターンに一致するディレクトリのリストを取得することであれば、次のようになります。

patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames

または一致しない場合:

set -o extendedglob
patterns=( '*Api' '*Panel' Common 'Site*' '.*' )
dirnames=( /some/path/^(${(j[|])~patterns})(ND/:t) )
print -rC1 -- $dirnames

あなたのアプローチについては、以下をお読みください。

これらのどれも、それがあなたに効果がない理由を説明していません。

それは私にとって効果的です。

Checking .Panel *Api ...
Checking .Panel *Panel ...
Matched .Panel *Panel
Checking .Panel Common ...
Checking .Panel Site*, ...
Checking .Panel .* ...
Matched .Panel .*
Checking SiteApi *Api ...
Matched SiteApi *Api
Checking SiteApi *Panel ...
Checking SiteApi Common ...
Checking SiteApi Site* ...
Matched SiteApi Site*
Checking SiteApi .* ...

bash -o xtracebash -x何が起こっているかを確認するには、(the same as)を使用してスクリプトを実行する必要があります。

または:

BASH_XTRACEFD=7 7> file.log bash -o xtrace ./the-script

トレース出力をファイルに保存します。

または、選択した場所に一部set -o xtrace(無効)を追加して、+oその追跡を有効/無効にします。

おすすめ記事