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