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

答え2

正規表現から引用符を削除します。

[[ ! "${dirPath}" =~ ^/[A-Za-z0-9/_-]+$ ]]

正規表現を引用すると、文字列の一致が強制されます。バッシュ3.2

比較するStackoverflowに関するこの質問

注:これはスクリプトを変更しますが、パスが正しいディレクトリパスであることを正しく確認しません。正しい確認方法についての@Kusalanandasの回答を参照してください。

答え3

この回答は、(現在の)質問の最初の部分に焦点を当てています。

ただし、スクリプトに渡される入力がディレクトリパスである場合は、最初から始める必要があります。

残りの問題は、パス名に対して特定の正規表現を照合して、有効なディレクトリパス名であることを確認することです。

通常、スクリプトは明確な理由なくユーザーのディレクトリまたはファイルに任意の命名スキームを適用しないでください。このパス名は、underというディレクトリが存在し、そのディレクトリにあるサブディレクトリを含む/var/%%^?/testシステムで完全に有効です。%%^?/vartest

あなたのスクリプトは何ですか本物問題はパス名を指定するかどうかです。既存のディレクトリ。ディレクトリパスが何であるかは重要ではありません。

これは次の方法で行うことができます。

#!/bin/bash

dirPath=$1

if [ ! -d "$dirPath" ]; then
    printf '"%s" is not a valid directory path\n' "$dirPath" >&2
    exit 1
fi

このif文の後に、これが"$dirPath"既存のディレクトリへのパスであることがわかります。上記のコードでは、ディレクトリのパス名は最初のコマンドライン引数から取得されます。

答え4

正規表現なしでファイルまたはディレクトリであることを確認するには、次のようにします。

if [ -d "${testpath}" ] ; then
    echo "$testpath is a directory";

関連情報