我正在尝试编写一个bash脚本,其中我必须读取用户输入的字符串。我需要允许这个字符串是适当的路径(父目录的分支和目标文件或目录),可以在linux和windows上适当地访问。
关于目录'名称和文件'名。我需要它们以适应linux和windows的要求。我知道在linux中使用bash 4.x(可能4不是决定性的)允许创建包含任何字符的任何名称的文件,但是我可能在访问这样的文件时遇到问题。
到目前为止,我知道:
等
有没有,比如POSIX标准或某些适合linux和windows要求的规则或东西?两者中允许哪些字符以及哪些字符都是例外?
另外,我无法检查字符串是否适合。我想我可以使用字母数字,下划线,连字符,圆括号,波浪线,空格,圆点。我还假设路径应该以斜线开头,而不是以斜线结束。
我尝试过像这样的正则表达式,但它们不能按照我的要求运行:
[[ ! "$path" == *['!'@#\$%^\&*+]* ]]
[[ "$path" == [a-zA-z0-9_.\ \(\)~\/-]* ]]
[[ "$path" =~ ^[a-zA-z0-9_\ -]+$ ]]
我只是没有获得bash正则表达式的所有特性。
那么,什么是要求以及验证它们的更好方法是什么?
答案 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