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。
注:これはスクリプトを変更しますが、パスが正しいディレクトリパスであることを正しく確認しません。正しい確認方法についての@Kusalanandasの回答を参照してください。
答え3
この回答は、(現在の)質問の最初の部分に焦点を当てています。
ただし、スクリプトに渡される入力がディレクトリパスである場合は、最初から始める必要があります。
残りの問題は、パス名に対して特定の正規表現を照合して、有効なディレクトリパス名であることを確認することです。
通常、スクリプトは明確な理由なくユーザーのディレクトリまたはファイルに任意の命名スキームを適用しないでください。このパス名は、underというディレクトリが存在し、そのディレクトリにあるサブディレクトリを含む/var/%%^?/test
システムで完全に有効です。%%^?
/var
test
あなたのスクリプトは何ですか本物問題はパス名を指定するかどうかです。既存のディレクトリ。ディレクトリパスが何であるかは重要ではありません。
これは次の方法で行うことができます。
#!/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";