Zsh中解析含空元素的数组时元素移位问题求助
解决zsh中解析含空元素文件时数组参数左移的问题
问题场景:
测试文件test内容:
test11|test12|test13|test14 test21||test23|test24
用户编写的函数及调用代码:
test_func() { local param=($@) echo "1: ${param[1]}, 2: ${param[2]}, 3: ${param[3]}, 4: ${param[4]}" } while IFS=\| read f1 f2 f3 f4 do arr=("$f1" "$f2" "$f3" "$f4") test_func ${arr[@]} done < test
运行后输出异常,第二行元素左移:
1: test11, 2: test12, 3: test13, 4: test14 1: test21, 2: test23, 3: test24, 4:
问题原因
- 函数调用时的参数传递问题:
test_func ${arr[@]}未对${arr[@]}添加双引号,zsh会对该扩展进行分词处理,空字符串会被直接忽略,导致第二行的空元素$f2未被传递到函数中。 - 函数内部数组赋值问题:
local param=($@)同样未对$@添加双引号,即使外部正确传递了空元素,这里的分词扩展也会丢失空元素。
解决方案
需要在两个关键位置添加双引号,确保空元素被保留:
- 修改函数内部的数组赋值:
test_func() { local param=("$@") # 给$@加双引号,保留所有参数(包括空元素) echo "1: ${param[1]}, 2: ${param[2]}, 3: ${param[3]}, 4: ${param[4]}" }
- 修改函数调用方式:
test_func "${arr[@]}" # 给${arr[@]}加双引号,传递所有数组元素(包括空元素)
修正后的完整代码
test_func() { local param=("$@") echo "1: ${param[1]}, 2: ${param[2]}, 3: ${param[3]}, 4: ${param[4]}" } while IFS=\| read f1 f2 f3 f4 do arr=("$f1" "$f2" "$f3" "$f4") test_func "${arr[@]}" done < test
运行结果
1: test11, 2: test12, 3: test13, 4: test14 1: test21, 2: , 3: test23, 4: test24
内容的提问来源于stack exchange,提问作者Sudipta Roy
相关产品推荐
相关产品推荐

