你好,我正在尝试将一个文件解析为一个包含空元素的数组
示例文件(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
我使用的是zsh 5.8.1 (x86_64-ubuntu-linux-gnu)
,得到了以下输出
1: test11, 2: test12, 3: test13, 4: test14
1: test21, 2: test23, 3: test24, 4:
请注意,在第二行中,元素向左移动。
我不知道我在这里做错了什么。有人能帮我一下吗?
谢谢
2条答案
按热度按时间xxe27gdn1#
您需要同时引用
${arr[@]}
和$@
,以便保留每个变量产生的空字符串。未加引号的参数扩展不受 * 单词拆分 * 的影响,但数组扩展产生的单独元素不是由于单词拆分。它们本身就是单独的单词,因此如果不将上述扩展加引号,则会产生未加引号的 * 单词 *。未加引号的空字符串只是“消失”。如果不将
$arr[@]
加引号,则空字符串永远不会进入test_func
,如果$@
不加引号,则在param
的赋值语句中不存在空字符串。o75abkj42#
使用
awk
命令要容易得多: