如果单字符文件名存在于包含在 [ ] 中的字符串中,则整个字符串将替换为该字符

if single-character filename exists within a string enclosed in [ ] entire string gets replaced with the character

我正在制作一次性脚本,称其为 a,但出现了一个非常令人惊讶的错误;该脚本在方括号中包含一些 ipv6 地址,其中一个包含字母 a.

我收到一条消息说 a 不是有效的 ipv6 地址。所以我进行了实验,我想我发现了一个非常隐蔽的错误。或者方括号和我想的不一样。

在 bash、sh 或 csh

中尝试此代码
mkdir /tmp/temp123
cd /tmp/temp123
echo [123abc]
touch a
echo [123abc]

输出为

[123abc]
a

我的结论是:

然后 shell 替换整个子字符串,包括 [ ].

双(或更多?)字符文件名对此没有影响。

WTF?!?

这不是错误。

方括号中的字符是glob matching的一部分。尝试:

cd /
echo [abcd]*

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

所以你需要引用你的价值观:

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