为什么用“readarray”构造的数组元素用双引号括起来时会获得一个虚构的“\n”?

为什么用“readarray”构造的数组元素用双引号括起来时会获得一个虚构的“\n”?

我发现了一种readarray我无法深究的行为。

下面的代码:

readarray array < <(echo -e "Jenny\nJane\nJessica")

echo "* Not enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo ${array[$i]}
done

echo "* Enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo "${array[$i]}"
done

产生以下输出:

* Not enclosed:
Jenny
Jane
Jessica
* Enclosed:
Jenny

Jane

Jessica

为什么当元素" "像这样被包围时会变得间隔开呢?
即使我echo "${array[$i]}"用这样的变量替换:

foo=${array[$i]}
echo "$foo"

输出仍然变得间隔。
但请注意,如果我以通常的方式声明数组,则array=("Jenny" "Jane "Jessica")无论引号如何,都不会插入空格。

这导致问题的原因是因为我正在循环数组并且需要使用句子中的元素并回显它。例如:

readarray array < <(echo -e "Jenny\nJane\nJessica")
for ((i=0; i<${#array[@]}; i++)); do
    echo "Hello, ${array[$i]}!"
done

但是${array[$i]}介于两者之间," "因此\n被插入并且输出变为:

Hello, Jenny
!
Hello, Jane
!
Hello, Jessica
!

答案1

这是因为 readarray 不会删除分隔符(默认为换行符),除非使用该-t选项调用它。

使用更简单的declare -p var方法打印数组值,看看这个:

$ readarray array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]=$'Jenny\n' [1]=$'Jane\n' [2]=$'Jessica\n')

您可以看到每个元素的尾随换行符。

虽然这样:

$ readarray -t array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]="Jenny" [1]="Jane" [2]="Jessica")

没有尾随换行符。

使用不带引号的变量扩展只是一个坏主意,只是不要这样做。

相关内容