检查string是否可以在Linux和Windows上的FS中的path

我想写一个bash脚本,我必须阅读由用户input的string。 我需要这个string被允许适当的path(父目录的分支和目标文件或目录),可以在Linux和Windows上适当地访问。

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

到目前为止,我知道:

  • 不像Linux,Windows无法访问其名称中冒号的文件
  • 与Windows不同的是,在访问名称中带有惊叹号的文件时,可能会出现问题
  • Windows不允许只包含空格的名称
  • Linux和Windows都不允许“。” 和“..”的名字
  • 窗口不允许只包含点的名称

等等

有没有,说POSIX标准或一些规则或东西,适合Linux和Windows的要求? 两者允许哪些字符,什么是例外?

此外,我有麻烦来检查一个string是否适合的path。 我认为我可以使用字母数字,下划线,连字符,圆括号,波浪线,空格,点。 我也假定path应该以斜线开始,而不是以斜线结束。

我试图像这些正则expression式,他们不工作,因为我希望他们:

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

我只是没有得到所有的bash正则expression式的特性。

那么,什么是要求,什么是更好的方法来validation它们?

我将编写一个白名单脚本,它接受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