ファイル名が特定のパターンと一致することを確認したいと思います。

ファイル名が特定のパターンと一致することを確認したいと思います。

ファイル名が英数字([a-zA-Z0-9])で始まり、英数字と「.」、「-」、および「_」文字のみを含む特定のパターンと一致することを確認したいと思います。

fileNamePattern="^[a-zA-Z0-9]+[\.-_]*"
if [[ $i(file from input) == $fileNamePattern ]]
      then
         echo "success"
      else
         echo "fail"
fi

これが私が解決しようとした方法ですが、「[[」の後に予期しない演算子が表示されませんでした。助けてください。

ベストアンサー1

拡張正規表現をワイルドカードパターンに変換する場合は、以下を含めずにcase ... esacinを使用してdash変数値が一致することを確認できますgrep

case $name in
    [a-zA-Z0-9]*[._-]*)
        echo success
        ;;
    *)
        echo failure
esac

このパターンは、一致する文字で始まり、ドット、アンダースコア、またはダッシュも含む値と一致します[a-zA-Z0-9](式が最後の文字セットを受け入れても確認したいと思います)。いいえ文字列に存在します)。._().-_の間の範囲を使用することはあまり意味がないので、ダッシュを角括弧式の末尾に移動しました。私もあなたを想定していますいいえリテラルバックスラッシュと一致させたいです。これを行うには、\\2番目の角かっこ式に追加します。

まあそうだ*大丈夫です。ただし、それ以外の英数字以外の文字と一致し続ける可能性があるため、目的の操作は実行されません。._-

テストの意味を変えて、次の名前をテストしてみましょう。失敗する:

case $name in
    *[![:alnum:]_.-]*)
        echo failure
        ;;
    *)
        echo success
esac

これで、値に存在すると予想されない文字を含む値が検出されます。価値があるかどうかを正しくテストしていません。スタートしかし、英数字で...

case $name in
    *[![:alnum:]_.-]*)
        echo 'failure (contains wrong characters)'
        ;;
    *)
        case $name in
            [[:alnum:]]*)
                echo success
                ;;
            *)
                echo 'failure (does not start with alnum)'
        esac
esac

これは最大2回のテストを実行します。まず、値に不要な文字が含まれていることを確認し、そうでない場合は正しい型の文字で始まるかどうかを確認します。

おすすめ記事