shell 解析包含emty元素的数组

yyhrrdl8  于 2023-01-31  发布在  Shell
关注(0)|答案(2)|浏览(107)

你好,我正在尝试将一个文件解析为一个包含空元素的数组
示例文件(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:

请注意,在第二行中,元素向左移动。
我不知道我在这里做错了什么。有人能帮我一下吗?
谢谢

xxe27gdn

xxe27gdn1#

您需要同时引用${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
o75abkj4

o75abkj42#

使用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

相关问题