Bash:ファイルの変数が正規表現と一致します。

Bash:ファイルの変数が正規表現と一致します。

私のスクリプトは次のとおりです。

  1. 特定のパスで利用可能なすべてのisosを検索する
  2. isos名をファイルのリストと比較する
  3. 一致するもののみを返す

簡単に言えば、コードは次のようになります。

isos_found=() # here we save the isos
isos_search=<find isos>
mapfile -t supported_isos < supported_systems # see below
for iso in "${isos_search[@]}" ; do
  [[ "${supported_isos[@]}" =~ "$(basename "$iso")"  ]] && isos_found+=("$iso")
done

supported_systems以下を含むファイルはどこにありますか?

clonezilla-live-2.6.1-25-amd64.iso
debian-live-10.0.0-amd64-xfce+nonfree.iso
linuxmint-19.1-cinnamon-64bit.iso
linuxmint-19.1-xfce-32bit.iso
lubuntu-18.04-alternate-amd64.iso

supported_systemsそれでは、ファイルの内容を次のように作成したいと思います。

clonezilla*
debian*
linuxmint*
lubuntu*

したがって、各バージョン/リリースをエンコードせずにリリース名のみを一致させる必要があります。

上記の()に似たコードを使用してこれは可能ですか"${supported_isos[@]}" =~ "$(basename "$iso")"?そうでない場合は、提案を受けることができます。

答え1

supported_systemsファイルに次のものが含まれていると仮定プレフィックス文字列(パターンではありません)

clonezilla
debian
linuxmint
lubuntu

その後、最初にすべてのISOファイルを見つけてから、特定のパターンと一致するかどうかを手動で確認するのではなく、これらの文字列を読み取ってファイルのグローバル一致に使用できます。

shopt -s dotglob nullglob globstar

isos=()
while IFS= read -r prefix; do
        isos+=( ./**/"$prefix"-*.iso )
done <supported_systems

printf '%s\n' "${isos[@]}"

まず、すべてのISOファイルを検索し、それを繰り返してプレフィックスに一致するファイルを見つけるには、次のようにします。

shopt -s dotglob nullglob globstar

isos=( ./**/*.iso )
while IFS= read -r prefix; do
        for iso in "${isos[@]}"; do
                if [[ $iso =~ /"$prefix"-[^/]*$ ]]; then
                        matched_isos+=( "$iso" )
                fi
        done
done <supported_systems

printf '%s\n' "${matched_isos[@]}"

ここで、正規表現は、/"$prefix"-[^/]*$与えられた$prefix(後に)で-始まるすべてのデフォルト名と一致します。

関連情報