在while循环中并行读取变量

时间:2017-09-21 21:06:51

标签: bash

为什么此编码会因并行读取两个变量而出现“模糊重定向”错误?我必须使用while或for循环,不能使用“paste”

#!/bin/bash
export fname="Adam Baden Caydin"
export lname="Sam Tam Uam"
while read first_name <$fname && read last_name <$lname
do
echo $first_name "    :    " $last_name
echo "doing some processing here..... "
done 

错误: /f1.sh:line 4:$ fname:ambiguous redirect

替换最后一行“完成”并给出相同的结果

done <<< "$fname $lname"

错误: ./f1.sh:4行:$ fname:模糊重定向

预期输出

Adman Sam
Baden Tam
Caydin Uam

1 个答案:

答案 0 :(得分:3)

read期望每个输入都在一个单独的行上,因此您必须用换行符替换空格。要并行读取名称,您需要将相应的项目组合到同一行输入中。您可以使用paste命令执行此操作。

paste <(tr ' ' '\n' <<<"$fname") <(tr ' ' '\n' <<<"$lname") | while read first_name last_name
do
echo $first_name : $last_name
done

糟糕,没有注意到使用paste的约束。另一种解决方案是使用数组而不是字符串:

fname=(Adam Baden Caydin)
lname=(Sam Tam Uam)
i=0
for first_name in "${fname[@]}"
do
    last_name=${lname[$i]}
    echo $first_name : $last_name
    ((i++))
done