首页 > 解决方案 > 在其中使用带有字母“a”的字符集会导致某些目录中出现意外行为

问题描述

我们有一些脚本可以解析字符串列表,这些脚本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:]在 shell 中执行了它,它只是返回了a. 这样的事情是如何工作的?有没有办法可以扭转这种情况?

标签: bashunixksh

解决方案


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

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

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

当括号没有用引号括起来时,它们会扩展为它们匹配的文件列表。搜索“shell 文件通配”以了解所有规则。在这种情况下,将是以下文件:

:
s
p
a
c
e

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

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

要点是:在 shell 中编程时,始终将字符串括在引号中。


推荐阅读