我正在尝试编写一个bash脚本,在其中必须读取用户输入的字符串。我需要这个字符串能够成为适当的路径(父目录和目标文件或目录的分支),并且可以在Linux和Windows上适当访问。
这与目录名称和文件名称有关。我需要它们符合Linux和Windows的要求。我知道在Linux中使用bash 4.x(也许4不是决定性的)可以创建包含任何字符的文件名,但我可能会遇到访问此类文件的问题。
到目前为止,我知道:
- 与Linux不同,Windows无法访问其名称中带有冒号的文件。 - 与Windows不同,Linux可能会在访问名称中带有惊叹号的文件时出现问题。 - Windows不允许只包含空格的名称。 - Linux和Windows都不允许“.”和“..”名称。 - Windows不允许只包含点的名称。
等等。
是否有POSIX标准或一些规则或其他符合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正则表达式的所有细节。
那么,有哪些要求以及验证它们的更好方法是什么?
ext4
这样的POSIX文件系统应该接受除NULL和斜杠(/
)之外的任何ASCII字符,斜杠是保留用于目录结构。您不能有名为.
或..
的文件,因为它们已经(隐式地)被认为是指当前目录或其父目录。我曾经读过一个邪恶的QA文件系统测试:一个包含254个文件的目录,每个文件都以除null和斜杠之外的每个ASCII字符命名。它几乎会破坏一切。 - Adam Katz