Как я могу преобразовать массив в список через запятую в Bash? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть массив, который я хочу преобразовать в одну строку или переменную в виде запятой, разделенной с помощью сценария оболочки.

У меня есть массив данных, и я просто печатаю значения, которые находятся внутри:

echo "${data[*]}"

Вывод:

/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_1.xml 
/QE-CI-RUN-71/workspace/QE-AU/57/testng-results_2.xml

Я просто хочу, чтобы вышеуказанный вывод был сохранен в отдельной переменной, разделенной запятыми, и я хочу использовать ее для дальнейшего использования.Как я могу добиться этого в Bash?

Массив данных является динамическим, он может иметь любое количество значений.Мне просто нужно извлечь их и создать переменную через запятую.

Ответы [ 5 ]

0 голосов
/ 18 июня 2019

Для ksh попробуйте это!

foo=`echo $(echo ${data[@]}) | tr ' ' ','`

Таким образом, вы можете управлять разделителем, переводя пробел (по умолчанию) в запятую!(или любой другой, о котором вы можете подумать):)

0 голосов
/ 12 апреля 2019
printComma(){
    printf "%s," "${@:1:${#}-1}"
    printf "%s" "${@:${#}}"
}
printNewline(){
    printf "%s\n" "${@:1:${#}-1}"
    echo "${@:${#}}"
}
join () {
  local IFS="$1"
  shift
  echo "$*"
}
declare -a comma=(
    a
    b
    c
)
declare -a newline=(
    xyz
    abc
    def
    ghi
)
echo "\
Comma separated list $(printComma "${comma[@]}")
Newline list: $(printNewline "${newline[@]}")

Comma separated list $(join , "${comma[@]}")
Newline list: $(join \n "${newline[@]}")"
Comma separated list a,b,c
Newline list: xyz
abc
def
ghi

Comma separated list a,b,c
Newline list: xyznabcndefnghi
0 голосов
/ 18 декабря 2018

Есть несколько способов сделать это.

Изменить разделитель поля $IFS (примечание, функциональный ответ Чепнера более элегантный):

OLD_IFS="$IFS"
IFS=","
echo "${data[*]}"
IFS="$OLD_IFS"

В фигурных скобках область изменения ограничена $IFS (в противном случае вас ждет сюрприз позже).

Перебрать его содержимое:

delim=""
for item in "${data[@]}"; do
  printf "%s" "$delim$item"
  delim=","
done
echo # add a newline

Предполагая первый символ в $IFS (по умолчанию пробел)нет ни в одном из элементов вашего массива, вы можете сохранить массив в виде строки и затем выполнить замену:

data_string="${data[*]}"
echo "${data_string//${IFS:0:1}/,}"

${IFS:0:1} - это подстрока $IFS, начинающаяся сначало и конец после одного символа.

0 голосов
/ 18 декабря 2018

Чтобы упростить локализацию изменения IFS, используйте функцию:

join () {
  local IFS="$1"
  shift
  echo "$*"
}

join , "${data[@]}"
0 голосов
/ 18 декабря 2018

Если вы хотите разделить запятыми, сделайте это первым символом в IFS:

data=( first second third )
IFS=,
echo "${data[*]}"

... испускает:

first,second,third
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...