mapfile和mapfile -t之间可以测试的区别是什么?

时间:2017-01-16 14:31:30

标签: linux bash shell

带选项t的样本1:

f(){
        mapfile -t aaa < /dev/stdin
        echo -e ${aaa[@]}
}
echo -e "a\nb\nc" | f

样品2没有选项t:

f(){
        mapfile aaa < /dev/stdin
        echo -e ${aaa[@]}
}
echo -e "a\nb\nc" | f

输出相同: a b c

编辑:

为什么@ cdarke&#39; s和@ heemayl的答案中有两个空格?
echo -e "a\nb\nc" | f2 | od -b

0000000 141 012 040 142 012 040 143 012 012
0000011

然后我尝试了这个:echo -e "a\tb\tc" | f2 | od -b

0000000 141 011 142 011 143 012 012
0000007

并且没有空格。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

要查看差异引用${aaa[@]}

echo -e "${aaa[@]}"

在没有引用的情况下,扩展正在根据IFS(以及路径名扩展)进行分词。由于元素(字符串)包含换行符,因此这些换行符将进行分词。

示例:

$ f() { mapfile -t aaa < /dev/stdin; echo -e "${aaa[@]}" ;}
$ echo -e "a\nb\nc" | f
a b c

$ g() { mapfile aaa < /dev/stdin; echo -e "${aaa[@]}" ;}
$ echo -e "a\nb\nc" | g
a
 b
 c

答案 1 :(得分:1)

问题在于echo

f1(){
    mapfile -t aaa < /dev/stdin
    echo -e "${aaa[@]}"       # note the quotes
}
echo -e "a\nb\nc" | f1

f2(){
    mapfile aaa < /dev/stdin
    echo -e "${aaa[@]}"       # note the quotes
}
echo -e "a\nb\nc" | f2

给出:

a b c
a
 b
 c

在第二种情况下,没有引号,换行符被视为空格。