使用字符集中带有字母“ a”的字符集会导致某些目录中出现意外行为

时间:2019-05-14 16:03:04

标签: bash unix ksh

我们有一些脚本使用echo $VALUE | tr -d [:space:]解析字符串列表,这些脚本在其原始目录中运行良好。但是,我们后来发现,应该将这些脚本保存在一个不同的目录中,因此我们认为没什么大不了的,然后将它们移了过来。但是,在将它们移到上方之后,我们注意到我们的输出变得一团糟,因为不再删除空格。相反,字符“ a”是唯一被删除的东西。

经过反复试验,我们发现包含字母'a'的字符集(例如

[:alnum:]  
[:alpha:]  
[:blank:]  
[:graph:]
[:space:] 

只是被替换为'a'。因此,运行echo $VALUE | tr -d [:space:]实际上只是删除字母'a'。示例:echo "t a r g e t" | tr -d [:space:]将返回t r g e t而不是target。为了确认这一点,我在外壳程序中执行了echo [:space:],它只返回了a。这样的事情如何运作?有什么办法可以扭转这种情况吗?

1 个答案:

答案 0 :(得分:4)

如果当前目录包含一个名为a的文件,则会发生您描述的事情。

要查看会发生什么,请运行以下命令:

echo [:space:]
echo "[:space:]"
echo '[:space:]'

当方括号未括在引号中时,它们会扩展到它们匹配的文件列表。搜索“ shell文件遍历”以了解所有规则。在这种情况下,将是以下文件:

:
s
p
a
c
e

如果当前目录中仅存在文件a,则第一个echo命令将扩展到该文件。

同样在该目录中创建文件pe时,第一个echo命令将输出a e p

收获是:在shell中进行编程时,始终将字符串用引号引起来。