if else ステートメントがあるがループを持つ Bash スクリプト変数

if else ステートメントがあるがループを持つ Bash スクリプト変数

私はbashスクリプトの経験があまりありません。ただし、ディレクトリ内の対応するxsdファイルを使用して個々のxmlファイルを検証しようとしています。開始名は同じままですが、日付が変更されます。

たとえば、

  • ファイル1.xsd
  • ファイル2.xsd
  • ファイル3.xsd

  • File1_random_date.xml
  • ファイル2_random_date.xml
  • ファイル2_random_date.xml
  • ファイル3_random_date.xml


File2.xsdに対してすべてのFile2 * .xmlファイルを検証し、File1.xsdなどに対してすべてのFile1 * .xmlを検証したいと思います。


それは次のとおりです。

xmllint --noout --schema File2.xsd File2_*.xml
xmllint --noout --schema File1.xsd File1_*.xml

しかし、正規表現文字列を使用して日付を表示し、File2_*.xmlが存在することを確認し、File2.xsdの各ファイルを検証する方法がわかりません。

助けが必要ですか?

答え1

そしてzsh

list=(file*_*.xml)
for prefix (${(u)list%%_*})
  xmllint --noout --schema $prefix.xsd ${prefix}_*.xml

答え2

次のことが役に立ちます(使用bash)。

# Iterate across the XSD files
for xsdfile in *.xsd
do
    test -f "$xsdfile" || continue

    # Strip the ".xsd" suffix and search for XML files matching this prefix
    prefix="${xsdfile%.xsd}"
    for xmlfile in "$xsdfile"_*.xml
    do
        test -f "$xmlfile" || continue
        xmllint --noout --schema "$xsdfile" "$xmlfile"
    done
done

1回の操作で一致するすべてのXMLファイルを確認するには、次のようにします。

# Iterate across the XSD files
for xsdfile in *.xsd
do
    test -f "$xsdfile" || continue

    # Strip the ".xsd" suffix and search for XML files matching this prefix
    prefix="${xsdfile%.xsd}"
    for xmlfile in "$xsdfile"_*.xml
    do
        # Skip if no files, else do it just once
        test -f "$xmlfile" || continue
        xmllint --noout --schema "$xsdfile" "$xsdfile"_*.xml
        break
    done       
done

関連情報