繁体   English   中英

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

[英]Check if string could be a path in FS on linux and windows

我正在尝试编写一个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正则表达式的所有特性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM