使用其中包含字母 '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 命令将扩展到该文件。
当您在该目录中同时创建文件 p
和 e
时,第一个 echo 命令将输出 a e p
.
要点是:在 shell.
中编程时,始终将字符串括在引号中
我们有一些脚本使用 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 命令将扩展到该文件。
当您在该目录中同时创建文件 p
和 e
时,第一个 echo 命令将输出 a e p
.
要点是:在 shell.
中编程时,始终将字符串括在引号中