检查字符串是否可以是Linux和Windows上FS的路径

时间:2016-03-10 02:45:09

标签: regex linux windows bash path

我正在尝试编写一个bash脚本,其中我必须读取用户输入的字符串。我需要允许这个字符串是适当的路径(父目录的分支和目标文件或目录),可以在linux和windows上适当地访问。

关于目录'名称和文件'名。我需要它们以适应linux和windows的要求。我知道在linux中使用bash 4.x(可能4不是决定性的)允许创建包含任何字符的任何名称的文件,但是我可能在访问这样的文件时遇到问题。

到目前为止,我知道:

  • 与linux不同,Windows无法访问名称中包含冒号的文件
  • 与windows不同,linux访问文件中可能存在问题,其名称中包含感叹号
  • windows不允许包含空格的名称
  • linux和windows都不允许"。"和" .."名称
  • windows不允许包含仅包含点的名称

有没有,比如POSIX标准或某些适合linux和windows要求的规则或东西?两者中允许哪些字符以及哪些字符都是例外?

另外,我无法检查字符串是否适合。我想我可以使用字母数字,下划线,连字符,圆括号,波浪线,空格,圆点。我还假设路径应该以斜线开头,而不是以斜线结束。

我尝试过像这样的正则表达式,但它们不能按照我的要求运行:

[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\ \(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]

我只是没有获得bash正则表达式的所有特性。

那么,什么是要求以及验证它们的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

我会写一个白名单脚本,它接受Windows和Unix环境路径名称的最小公分母,但我想在文件前缀和分隔符方面必须区分Windows和Unix世界。

以下脚本可能是一个有用的起点。您可以将路径作为第一个参数传递给脚本,并在路径正常时返回OK(即它满足正则表达式),或者当path不满足正则表达式时返回NOK。

对于正则表达式匹配,我在脚本中使用了egrep(选项-x意味着给定的字符串必须匹配整个字符串)。 $?表示egrep的返回值---如果为零,则参数path成功匹配正则表达式。

最佳,   儒略

#!/bin/bash

DELIM="/"
FILE="[a-zA-Z]([a-zA-Z0-9])*"
R="(${DELIM})?${FILE}(${DELIM}${FILE})*${DELIM}?"

path=$1

echo "$path" | egrep -x "$R"

[ $? -eq 0 ] && {
    echo "OK"
    exit 0
}

echo "NOK"
exit 1