我们有一些脚本使用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
。这样的事情如何运作?有什么办法可以扭转这种情况吗?
答案 0 :(得分:4)
如果当前目录包含一个名为a
的文件,则会发生您描述的事情。
要查看会发生什么,请运行以下命令:
echo [:space:]
echo "[:space:]"
echo '[:space:]'
当方括号未括在引号中时,它们会扩展到它们匹配的文件列表。搜索“ shell文件遍历”以了解所有规则。在这种情况下,将是以下文件:
:
s
p
a
c
e
如果当前目录中仅存在文件a
,则第一个echo命令将扩展到该文件。
同样在该目录中创建文件p
和e
时,第一个echo命令将输出a e p
。
收获是:在shell中进行编程时,始终将字符串用引号引起来。