Я делаю функцию, чтобы легко преобразовать мои строки в массивы, как мне нужно.установка позиционного параметра в функции в bash
Я немного запутался в странную проблему. Я до сих пор новичок в bash, и это действительно подталкивает меня. Кто-нибудь сможет пролить свет на это?
convert.sh
#!/bin/bash
convert2array() {
read -a $1_arr <<< $1
}
mx=$(dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//')
convert2array "$mx"
echo ${mx_arr[@]}
Выход:
bash -x convert2array.sh
++ sed 's/\.$//'
++ cut '-d ' -f 2
++ dig +short google.com mx
+ mx='alt2.aspmx.l.google.com
alt3.aspmx.l.google.com
alt1.aspmx.l.google.com
aspmx.l.google.com
alt4.aspmx.l.google.com'
+ convert2array mx
+ read -a mx_arr
+ echo 585911
585911
С помощью двойного цитирования подстановки команд вы всегда создаете массив с элементом _single_, содержащим _all lines_, что не является целью. Без двойного цитирования выходные строки неизменно подвергаются разбиению на слова и глобулизации, и даже если это происходит в этом случае, '($ (...))' не является, как правило, надежным способом считывания вывода команды в массив (если вы не установите '$ IFS' и отключите глобусы, что не стоит усилий). – mklement0
@ mklement0: Спасибо за указатель. Я подумал об этом, но потом забыл взять двойные кавычки в спешке, чтобы опубликовать ответ :) Изменен сейчас – sjsam
@ mklement0: Кроме того, я согласен со второй частью вашего комментария – sjsam