为何Bash数组对[10000]的拆分不符合预期?
问题原因分析
你遇到的问题是bash的单词拆分和**路径名扩展(通配符匹配)**机制导致的,下面逐个拆解三个案例的行为:
1. 案例:var="[ 1]"
执行vararray=($var)时,bash先展开$var得到[ 1],再根据默认的IFS(空格、制表符、换行)做单词拆分,拆出[和1]两个元素,因此vararray[0]的值是[。
2. 案例:var="[20]"
展开后得到[20],因为没有空格不会被拆分。接下来bash尝试路径名扩展:[20]是字符类通配符,代表匹配单个字符为2或0的文件。如果当前目录下没有这类文件,bash会保留原字符串,所以vararray[0]的值是[20]。
3. 案例:var="[10000]"
展开后得到[10000],字符类通配符里的重复字符会被忽略,等价于[10],代表匹配单个字符为1或0的文件。如果当前目录下正好有名为1的文件,bash会把通配符替换成匹配到的文件名,因此vararray[0]的值变成了1。
正确写法
如果要把完整字符串作为数组的单个元素,必须用双引号包裹变量,避免触发单词拆分和路径扩展:
var="[10000]" vararray=("$var") echo "var=${var}" echo "vararray[0]=${vararray[0]}"
执行后会得到预期结果:
var=[10000] vararray[0]=[10000]
内容的提问来源于stack exchange,提问作者user3909192
相关产品推荐
相关产品推荐

