bash - 在其中使用带有字母“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
. 这样的事情是如何工作的?有没有办法可以扭转这种情况?
解决方案
如果当前目录包含一个名为a
.
要查看会发生什么,请运行以下命令:
echo [:space:]
echo "[:space:]"
echo '[:space:]'
当括号没有用引号括起来时,它们会扩展为它们匹配的文件列表。搜索“shell 文件通配”以了解所有规则。在这种情况下,将是以下文件:
:
s
p
a
c
e
如果a
当前目录中仅存在该文件,则第一个 echo 命令将扩展为该文件。
当您创建文件p
并e
在该目录中时,第一个 echo 命令将输出a e p
.
要点是:在 shell 中编程时,始终将字符串括在引号中。
推荐阅读
- ros - 添加要导入ROS的包
- javascript - 需要动画数字
- javascript - 来自父级的 Angular 子组件事件多次触发
- filter - NumberRangeColumnFilter 的反应表 globalFilter 示例
- excel - 使用 Excel 打开新的 PowerPoint 演示文稿失败
- ngrok - ngrok,无法完成隧道连接
- javascript - 未捕获的类型错误:无法读取 AJAX 对象上未定义的属性“地图”
- linux - 如何比较bash中单个数组的值之间的不同参数?
- android - Viewholder 仅在滚动时绑定图像,而不是在初始加载时
- python - 如何使用 lxml 创建命名空间元素?