Создайте массив из файла и назовите его на основе строки в bash - PullRequest
1 голос
/ 22 мая 2019

У меня есть такой текстовый файл:

src_dir=source1
src_dir=source2
dst_dir=dest1
whatever_thing=thing1
whatever_thing=thing2

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

src_dir=(source1 source2)
dst_dir=(dest1)
whatever_thing=(thing1 thing2)

Я уже пробовал:

while read -r -a line
do
    IFS='= ' read -r -a array <<< "$line"
    "${array[0]}"+="${array[1]}"
done < file.txt

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Если ваша bash версия 4.3 или новее, declare имеет опцию -n определить ссылку на имя переменной, которая работает как reference в C++. Тогда, пожалуйста, попробуйте следующее:

while IFS== read -r key val; do
    declare -n name=$key
    name+=("$val")
done < file.txt

# test
echo "${src_dir[@]}"
echo "${dst_dir[@]}"
echo "${whatever_thing[@]}"
0 голосов
/ 22 мая 2019

попробуйте это:

#!/bin/bash
mapfile -t arr < YourDataFile.txt
declare -A dict
for line in "${arr[@]}"; do
    key="${line%%=*}"
    value="${line#*=}"
    [ ${dict["$key"]+X} ] && dict["$key"]+=" $value" || dict["$key"]="$value"
done

for key in "${!dict[@]}"; do
    printf "%s=(%s)\n" "$key" "${dict["$key"]}"
done

объяснение

# read file into array
mapfile -t arr < YourDataFile.txt

# declare associative array
declare -A dict

# loop over the data array
for line in "${arr[@]}"; do

    # extract key
    key="${line%%=*}"

    # extract value
    value="${line#*=}"

    # write into associative array
    #   - if key exists ==> append value
    #   - else initialize entry
    [ ${dict["$key"]+X} ] && dict["$key"]+=" $value" || dict["$key"]="$value"
done

# loop over associative array
for key in "${!dict[@]}"; do

    # print key=value pairs
    printf "%s=(%s)\n" "$key" "${dict["$key"]}"
done

вывод

dst_dir=(dest1)
src_dir=(source1 source2)
whatever_thing=(thing1 thing2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...