Bashスクリプトで正規表現を使用する

Bashスクリプトで正規表現を使用する

Bashスクリプトでできることがたくさんあります。ただし、スクリプトに渡される入力がディレクトリパスである場合は、最初から始める必要があります。たとえば、ディレクトリパスを知る正しい方法は「/var/lib/test」であり、誤った方法は「/var/%%^?/test」です。

ここでtestはファイルではなくディレクトリです。

ディレクトリパスには文字を含めることができます。 [A-Za-z0-9/_-]

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

#!/bin/bash
dirPath="/var/lib/test"
if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
    echo "Success"
else
    echo "Failure"
fi

ここで、dirPathには、他のスクリプトによって提供されるすべてのパスがあります。

ここで何が間違っているのか教えてください。

ベストアンサー1

if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
    echo "Success"

これは$dirPathリテラル文字列をテスト^/[A-Za-z0-9/_-]+$し、結果を反転します。つまり、isがリテラル文字列でないSuccess場合は$dirPath印刷されます。これは、正規表現の引用符文字が現在のバージョンの Bash で特別な意味を失い、もちろん!リバーステストでも使用されていないためです。

実際の正規表現に対して変数をテストする場合は、最も簡単な方法は、正規表現を最初に変数に入れてから引用符をオフにすることです。変数を使用する必要はありませんが、複雑な正規表現の解析に伴う問題の一部を回避できます。問題):

dirPath="/var/lib/test"
re='^/[A-Za-z0-9/_-]+$'
if [[ ${dirPath} =~ $re ]]; then
    echo "'$dirPath' starts with a slash, and is composed of alphanumerics, hyphens, underscores and slashes only"
else
    echo "'$dirPath' is of a forbidden format"
fi

もちろん、パスが既存のディレクトリであるかどうかをテストするには、次のものを使用できます-d

if [[ -d $dirPath ]]; then
    echo "'$dirPath' exists and is a directory
fi

おすすめ記事