如果单字符文件名存在于包含在 [ ] 中的字符串中,则整个字符串将替换为该字符
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
我的结论是:
如果当前目录中存在单字符文件名的文件
AND 该字符位于 [ ]
之间的任意位置
AND [ ] 外有空格(x[abc]y 不起作用)
然后 shell 替换整个子字符串,包括 [ ].
双(或更多?)字符文件名对此没有影响。
WTF?!?
这不是错误。
方括号中的字符是glob matching的一部分。尝试:
cd /
echo [abcd]*
如果没有文件与给定的掩码匹配,则按原样打印掩码。
所以你需要引用你的价值观:
mkdir /tmp/temp123
cd /tmp/temp123
echo "[123abc]"
touch a
echo "[123abc]"
我正在制作一次性脚本,称其为 a,但出现了一个非常令人惊讶的错误;该脚本在方括号中包含一些 ipv6 地址,其中一个包含字母 a.
我收到一条消息说 a 不是有效的 ipv6 地址。所以我进行了实验,我想我发现了一个非常隐蔽的错误。或者方括号和我想的不一样。
在 bash、sh 或 csh
中尝试此代码mkdir /tmp/temp123
cd /tmp/temp123
echo [123abc]
touch a
echo [123abc]
输出为
[123abc]
a
我的结论是:
如果当前目录中存在单字符文件名的文件
AND 该字符位于 [ ]
之间的任意位置
AND [ ] 外有空格(x[abc]y 不起作用)
然后 shell 替换整个子字符串,包括 [ ].
双(或更多?)字符文件名对此没有影响。
WTF?!?
这不是错误。
方括号中的字符是glob matching的一部分。尝试:
cd /
echo [abcd]*
如果没有文件与给定的掩码匹配,则按原样打印掩码。
所以你需要引用你的价值观:
mkdir /tmp/temp123
cd /tmp/temp123
echo "[123abc]"
touch a
echo "[123abc]"