如果单个字符的文件名存在于用[ ]括起来的字符串中,则整个字符串将被替换为字符。

问题描述 投票:0回答:1

我在做一个一次性脚本,调用它只是a,我得到了一个非常令人惊讶的错误,脚本中包含了一些方括号中的ipv6-地址,其中一个包括字母a。

我得到一个消息说a不是一个有效的ipv6地址。于是我做了实验,我想我发现了一个非常隐晦的错误。或者说方括号比我想的有另外的含义。

试试这段代码,在bash、sh或csh中使用

mkdir /tmp/temp123
cd /tmp/temp123
echo [123abc]
touch a
echo [123abc]

输出是

[123abc]
a

我的结论是

  • 如果当前目录中存在一个单字符文件名的文件

  • 而这个字符是介于[ ]和[ ]之间的任何地方。

  • 而且在[ ]外有空格(x[abc]y不工作)。

然后shell会替换整个子串,包括[ ]。

两个(或更多?)字符的文件名不影响这一点。

WTF?!!?

bash sh csh
1个回答
2
投票

这不是一个错误。

方括号中的字符是方括号中的部分。球状匹配. 尝试。

cd /
echo [abcd]*

如果没有与给定掩码相匹配的文件,那么掩码就按原样打印。

所以你需要引用你的值。

mkdir /tmp/temp123
cd /tmp/temp123
echo "[123abc]"
touch a
echo "[123abc]"
© www.soinside.com 2019 - 2024. All rights reserved.