[英]Parsing an array with emty element
您好,我正在尝试将文件解析为包含空元素的数组
示例文件( 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]}"
}
现在我称这个 function 如下
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)
。 我得到以下 output
1: test11, 2: test12, 3: test13, 4: test14
1: test21, 2: test23, 3: test24, 4:
请注意,在第二行中,元素向左移动。
我不确定我在这里做错了什么。 有人可以帮我吗?
谢谢
您需要引用${arr[@]}
和$@
以保留每个产生的空字符串。
未加引号的参数扩展不受分词影响,但数组扩展产生的单独元素不受分词影响。 它们本身就是独立的单词,因此不引用上述扩展中的任何一个都会产生未引用的单词。 一个不带引号的空字符串只是“消失”。 如果$arr[@]
不加引号,空字符串永远不会进入test_func
,如果$@
不加引号,则空字符串不会出现在对param
的赋值中。
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
使用awk
命令要容易得多:
awk -F'\\|' -v OFS=', ' '{ for(i=1;i<=NF;i++) $i=i": "$i }1' test.txt
1: test11, 2: test12, 3: test13, 4: test14
1: test21, 2: , 3: test23, 4: test24
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.