在 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/_-]+$,并反转结果。换句话说,Success$dirPathis 不是该文字字符串时,它将打印。这是因为正则表达式中的引号字符在当前版本的 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";

相关内容