使用其中包含字母 'a' 的字符集会导致某些目录出现意外行为

Using character sets with letter 'a' in them are resulting in unexpected behavior within certain directories

我们有一些脚本使用 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:] 将 return t r g e t 而不是 target。为了证实这一点,我在 shell 中执行了 echo [:space:],它只是 returned a。这样的事情是如何工作的?有什么办法可以扭转这种情况吗?

如果当前目录包含一个名为 a.

的文件,就会发生您所描述的情况

要查看会发生什么,运行 这些命令:

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

如果括号未包含在引号中,它们将扩展为匹配的文件列表。搜索 "shell file globbing" 以了解所有规则。在这种情况下,将是以下文件:

:
s
p
a
c
e

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

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

要点是:在 shell.

中编程时,始终将字符串括在引号中