我在做一个一次性脚本,调用它只是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?!!?
这不是一个错误。
方括号中的字符是方括号中的部分。球状匹配. 尝试。
cd /
echo [abcd]*
如果没有与给定掩码相匹配的文件,那么掩码就按原样打印。
所以你需要引用你的值。
mkdir /tmp/temp123
cd /tmp/temp123
echo "[123abc]"
touch a
echo "[123abc]"