我创建了一个环境变量:
WD=`pwd`
如何检查其中是否包含空格或非英文字母?
答案1
我认为“非英语字母”指的是除了 26 个朴素的拉丁字母之外的字母。那么,严格来说,这是一个满足您要求的测试:
if tmp=${WD//[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/};
[[ $tmp = *[[:alpha:] ]* ]]; then
# $WD contains letters other than A-Z and a-z or a space
也就是把英文字母去掉,看看是否还有字母或者空格。
我怀疑您实际上是在尝试避免所有非 ASCII 字符和所有空格,包括不是字母的字符,例如¿
or£
或٣
。您可以通过匹配不!
通过的字符~
(即除空格之外的 ASCII 字符)来做到这一点:
if (LC_ALL=C; [[ $WD = *[^!-~]* ]]) then …
注意范围喜欢!-~
或A-Z
并不总是按照您设定的预期进行LC_COLLATE
。因此我们设置LC_ALL
为一个已知值(LC_ALL
胜过所有语言环境设置)。
如果您要检查文件中的“不寻常”字符(为什么还要排除大多数现代平台上允许的空格),那么有一个更严格的列表不允许任何不可移植的字符可能是有意义的。POSIX只允许 ASCII 字母、数字和-._
.
if (LC_ALL=C; [[ $WD = *[^-._0-9A-Za-z]* ]]) then …
答案2
正则表达式grep
就是您要寻找的。
我们匹配任何非英文字母或数字或/
(因为它是每个路径的一部分)。
if [[ -n "$( pwd | grep -o -P "([^a-zA-Z0-9\/])*" )" ]]; then
echo "error"
fi
sed
在这种情况下也可以使用。
如果可以将所有正确的符号替换为${WD}
并''
查看是否还剩下一些东西。如果结果字符串的长度非零 -${WD}
则不正确。
所以,如果我们只期望/
、 数字和英文字母。
if [[ -n "$( pwd | sed -r -e 's/([a-zA-Z0-9\/])*//g' )" ]]; then
echo "error"
fi
答案3
tr
在这种情况下比grep
或稍微简单一些:sed
if [[ -n "$(echo $WD|tr -d '[:alnum:]/')" ]];then
echo "gotcha"
fi
答案4
Bash 可以进行自己的模式匹配。
if [[ ${WD} = *[^[:alnum:]/]* ]]; then
echo 'Baaaad.'
fi