Почему элемент массива, построенный с помощью `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") моды 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 ! 

One Solution collect form web for “Почему элемент массива, построенный с помощью `readarray`, получает фиктивный` \ n`, когда он заключен в двойные кавычки?”

Это связано с тем, что 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") 

не имеет задней строки.

Использование неопределенного расширения переменных – всего лишь плохая идея, просто нет.

Interesting Posts

надежный способ обнаружения процесса java

ArchLinux монтирует файловую систему без записей в / etc / fstab

Как запустить службу systemd onehot, когда моя система получает новый IPv6-адрес?

Ошибка Broken GLX при использовании Bumblebee 3.2.1 на openSUSE 13.1

100% дистрибутив Linux с открытым исходным кодом

планирование работы cron для остановки службы в четверг и запуск ее в пятницу

Как загружать и загружать ISO по GRUB2

fork: retry: ресурс временно недоступен

Fordward входящий RDP (порт 3389) связь с LAN-машиной

Отключение DMA в Linux по-прежнему поддерживается

Как перенаправить сообщения ядра с уникальной подстрокой id в отдельный файл журнала (используя `rsyslog`)?

разница между и \ (\) в Basic Regular Expression

Почему в этом сценарии оболочки bourne выполняется `exec 2> & 1`?

эхо в файл с другим пользовательским разрешением

Почему я не могу найти файлы cookie с веб-сайтов, доступных через IP-адрес в Firefox cookie.sqlite?

Linux и Unix - лучшая ОС в мире.