Intereting Posts
Как определить тип файла низкого уровня? в какой директории должен быть скомпилирован Firefox? Как добавить Dvorak в Debian greeter установочного носителя CD / USB? Как получить номера телефонов из файла в правильном формате с помощью awk? Рабочий скрипт нуждается в настройке Различия между доменными сокетами Unix и сетевыми сокетами? Как лучше всего включить конфигурацию Wi-Fi или Ethernet на встроенном устройстве? С помощью systemd-networkd выполните действие при изменении конфигурации сети Need .htaccess Rewrite Rule To Remove Trailing <br% 20 /> Как определить, находится ли метка диска FreeBSD в первом секторе диска? Найдите файлы, переименуйте их с помощью «uuidgen» и добавьте расширение найти . . * -тип f -print0 | xargs -0 sudo chmod 664; не работает Найти совпадения для 5-го столбца в файлах с разделителями каналов Проблема с sed Как подключить diff к Kompare? Требует ли rsync как хоста-источника, так и целевого хоста запускать rsync в качестве клиента, сервера или демона?

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

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

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

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